From 263b3f1b0f106dd888dbbb3de74b681d5d073650 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Sat, 24 Aug 2024 11:05:21 +0800 Subject: [PATCH] =?UTF-8?q?angang=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xmgl/modules/project/entity/Project.java | 4 +- .../quality/entity/QualityRectifyRecord.java | 2 +- .../impl/QualityRectifyRecordServiceImpl.java | 54 +-- ...AnalyseHardWareAlarmRecordServiceImpl.java | 6 +- .../impl/EnterpriseInfoServiceImpl.java | 2 +- .../impl/UserEnterpriseServiceImpl.java | 3 +- ...InspectionStandardBigScreenController.java | 72 ++-- ...zSupplierQualificationApplyController.java | 342 +++++++++++++++++- .../XzSecurityQualityRectifyRecord.java | 2 +- .../xz/security/entity/vo/FiveScore.java | 15 - .../xz/security/entity/vo/FiveScoresVo.java | 2 +- .../xz/security/entity/vo/TenScore.java | 31 ++ ...curityQualityRectifyRecordServiceImpl.java | 51 +-- .../IXzSupplierQualificationApplyService.java | 10 + ...SupplierQualificationApplyServiceImpl.java | 5 + .../zhgd/xmgl/security/WebSecurityConfig.java | 3 + .../java/com/zhgd/xmgl/util/FlowUtil.java | 88 +++++ .../java/com/zhgd/xmgl/util/PathUtil.java | 28 +- .../application-gsx-t-dev.properties | 2 + .../lib/wflow-server-1.0-SNAPSHOT.jar | Bin 507229 -> 507560 bytes 20 files changed, 587 insertions(+), 135 deletions(-) delete mode 100644 src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScore.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/TenScore.java create mode 100644 src/main/java/com/zhgd/xmgl/util/FlowUtil.java diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java index ea879027e..c5e5cc335 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java @@ -325,8 +325,8 @@ public class Project implements Serializable { private Integer enableWorkerSafeWatch; @ApiModelProperty(value = "安全履职报警推送时间") private String workerSafeWatchTime; - - + @ApiModelProperty(value = "是否需要项目管理员做AI抓拍初筛") + private Integer aiAlarmNeedManageApprove; /** * runde平台token */ diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRectifyRecord.java b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRectifyRecord.java index d223ef69f..708071b96 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRectifyRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRectifyRecord.java @@ -82,7 +82,7 @@ public class QualityRectifyRecord implements Serializable { */ @Excel(name = "违章人员", width = 15) @ApiModelProperty(value = "违章人员") - private Long violatorId; + private String violatorId; @TableField(exist = false) private String realName; diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java index 357ac99ad..d7a4ab420 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRectifyRecordServiceImpl.java @@ -18,7 +18,6 @@ import com.zhgd.redis.lock.redisson.DistributedLock; import com.zhgd.redis.lock.redisson.RedissonDistributedLock; import com.zhgd.xmgl.call.SanjiangDataCall; import com.zhgd.xmgl.constant.Cts; -import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; @@ -40,7 +39,6 @@ import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; import com.zhgd.xmgl.modules.worker.service.IWorkerInfoService; import com.zhgd.xmgl.modules.xz.entity.XzDeductScoreRecord; import com.zhgd.xmgl.modules.xz.mapper.XzDeductScoreRecordMapper; -import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityRectifyRecord; import com.zhgd.xmgl.push.config.PushPayloads; import com.zhgd.xmgl.util.TimeUtil; import org.apache.commons.collections.CollectionUtils; @@ -216,34 +214,36 @@ public class QualityRectifyRecordServiceImpl extends ServiceImpl map = new HashMap<>(16); + map.put("id", workerInfo.getId()); + map.put("deductScore", ds); + workerInfoService.updateScoreSendAuth(map); + + + //存记录 + XzDeductScoreRecord vo = new XzDeductScoreRecord(); + vo.setProjectSn(qualityInspectionRecord.getProjectSn()); + vo.setWorkerId(workerInfo.getId()); + vo.setTypeName(item.getContent()); + vo.setDeductScore(-item.getDeductScore()); + vo.setType(3); + vo.setCreateDate(new Date()); + vo.setCurScore(workerInfo.getSafeScore() - item.getDeductScore() >= 0 ? workerInfo.getSafeScore() - item.getDeductScore() : 0); + vo.setDeductReason(StrUtil.format("您在{}发现质量隐患({}-{})扣{}分", DateUtil.format(vo.getCreateDate(), "yyyy年MM月dd日HH:mm:ss"), "质量检査", vo.getTypeName() == null ? "无" : vo.getTypeName(), item.getDeductScore())); + vo.setTypeTableId(qualityInspectionRecord.getId()); + xzDeductScoreRecordMapper.insert(vo); } - - //扣分 - HashMap map = new HashMap<>(16); - map.put("id", workerInfo.getId()); - map.put("deductScore", ds); - workerInfoService.updateScoreSendAuth(map); - - - //存记录 - XzDeductScoreRecord vo = new XzDeductScoreRecord(); - vo.setProjectSn(qualityInspectionRecord.getProjectSn()); - vo.setWorkerId(workerInfo.getId()); - vo.setTypeName(item.getContent()); - vo.setDeductScore(-item.getDeductScore()); - vo.setType(3); - vo.setCreateDate(new Date()); - vo.setCurScore(workerInfo.getSafeScore() - item.getDeductScore() >= 0 ? workerInfo.getSafeScore() - item.getDeductScore() : 0); - vo.setDeductReason(StrUtil.format("您在{}发现质量隐患({}-{})扣{}分", DateUtil.format(vo.getCreateDate(), "yyyy年MM月dd日HH:mm:ss"), "质量检査", vo.getTypeName() == null ? "无" : vo.getTypeName(), item.getDeductScore())); - vo.setTypeTableId(qualityInspectionRecord.getId()); - xzDeductScoreRecordMapper.insert(vo); } diff --git a/src/main/java/com/zhgd/xmgl/modules/video/service/impl/AiAnalyseHardWareAlarmRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/video/service/impl/AiAnalyseHardWareAlarmRecordServiceImpl.java index ff33ea3f1..1a65bdc7c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/video/service/impl/AiAnalyseHardWareAlarmRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/video/service/impl/AiAnalyseHardWareAlarmRecordServiceImpl.java @@ -138,7 +138,8 @@ public class AiAnalyseHardWareAlarmRecordServiceImpl extends ServiceImpl queryAiAnalyseHardWareAlarmPageList(Map map) { @@ -262,6 +263,9 @@ public class AiAnalyseHardWareAlarmRecordServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserEnterprise::getUserId, userId); diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/controller/SafetyInspectionStandardBigScreenController.java b/src/main/java/com/zhgd/xmgl/modules/xz/controller/SafetyInspectionStandardBigScreenController.java index 57c4c436f..bd5e179ad 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/controller/SafetyInspectionStandardBigScreenController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/controller/SafetyInspectionStandardBigScreenController.java @@ -11,8 +11,8 @@ import com.zhgd.xmgl.modules.xz.entity.vo.SafetyTypeScore; import com.zhgd.xmgl.modules.xz.entity.vo.SafetyTypeScoreVo; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityDangerItemRecord; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityDangerTypeRecord; -import com.zhgd.xmgl.modules.xz.security.entity.vo.FiveScore; import com.zhgd.xmgl.modules.xz.security.entity.vo.FiveScoresVo; +import com.zhgd.xmgl.modules.xz.security.entity.vo.TenScore; import com.zhgd.xmgl.modules.xz.security.entity.vo.XzSecurityQualityInspectionRecordVo; import com.zhgd.xmgl.modules.xz.security.enums.TenSafetyTypeEnum; import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityDangerItemRecordService; @@ -67,58 +67,32 @@ public class SafetyInspectionStandardBigScreenController { SafetyTypeScoreVo thisMonthScoreVo = this.getScores(new MapBuilder().put("projectSn", projectSn).put("month", DateUtil.format(new Date(), "yyyy-MM")).build()).getResult(); SafetyTypeScoreVo lastMonthScoreVo = this.getScores(new MapBuilder().put("projectSn", projectSn).put("month", DateUtil.format(DateUtil.offsetMonth(new Date(), -1), "yyyy-MM")).build()).getResult(); List safetyTypeScores = thisMonthScoreVo.getSafetyTypeScores(); - FiveScore fiveScore = new FiveScore(); - Map> fiveTypeScoreMap = new HashMap<>(16); - //5种:1安全管理、2文明施工、3施工支具【脚手架、模版支架】、4工程器械【物料提升机与施工升降机、塔式起重吊装、施工用具】、5危险作业【基坑工程、高处作业、施工用电】 + TenScore tenScore = new TenScore(); for (SafetyTypeScore safetyTypeScore : safetyTypeScores) { - int fiveType; + BigDecimal score = safetyTypeScore.getScore(); if (Objects.equals(safetyTypeScore.getTenType(), 1)) { - fiveType = 1; + tenScore.setAqgl(score); } else if (Objects.equals(safetyTypeScore.getTenType(), 2)) { - fiveType = 2; - } else if (Objects.equals(safetyTypeScore.getTenType(), 3) - || Objects.equals(safetyTypeScore.getTenType(), 6) - ) { - fiveType = 3; - } else if (Objects.equals(safetyTypeScore.getTenType(), 8) - || Objects.equals(safetyTypeScore.getTenType(), 9) - || Objects.equals(safetyTypeScore.getTenType(), 10) - ) { - fiveType = 4; - } else { - fiveType = 5; - } - List typeScores = fiveTypeScoreMap.get(fiveType); - if (typeScores == null) { - typeScores = new ArrayList<>(); - } - typeScores.add(safetyTypeScore); - fiveTypeScoreMap.putIfAbsent(fiveType, typeScores); - } - for (Map.Entry> entry : fiveTypeScoreMap.entrySet()) { - List list = entry.getValue(); - if (list.size() == 0) { - continue; - } - BigDecimal score = list.stream().map(SafetyTypeScore::getScore).reduce(BigDecimal.ZERO, BigDecimal::add); - switch (entry.getKey()) { - case 1: - fiveScore.setAqgl(score); - break; - case 2: - fiveScore.setWmsg(score); - break; - case 3: - fiveScore.setSgzj(score); - break; - case 4: - fiveScore.setGcqx(score); - break; - default: - fiveScore.setWxzy(score); + tenScore.setWmsg(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 3)) { + tenScore.setJsj(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 4)) { + tenScore.setGczy(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 5)) { + tenScore.setJkgc(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 6)) { + tenScore.setMbzj(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 7)) { + tenScore.setSgyd(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 8)) { + tenScore.setWltsj(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 9)) { + tenScore.setTsqzj(score); + } else if (Objects.equals(safetyTypeScore.getTenType(), 10)) { + tenScore.setSgjj(score); } } - vo.setThisMonthScores(fiveScore); + vo.setThisMonthScores(tenScore); vo.setMonthScore(thisMonthScoreVo.getScore()); vo.setLastMonthScore(lastMonthScoreVo.getScore()); vo.setDifferScoreRate(vo.getLastMonthScore().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : vo.getMonthScore().subtract(vo.getLastMonthScore()).divide(vo.getLastMonthScore(), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_HALF_UP)); @@ -208,7 +182,7 @@ public class SafetyInspectionStandardBigScreenController { * @return */ private boolean isNeedGuarantee(String code) { - return !(Objects.equals(code,"13") || Objects.equals(code,"19")); + return !(Objects.equals(code, "13") || Objects.equals(code, "19")); } @ApiOperation(value = "获取分项检查评分表列表", notes = "获取分项检查评分表列表", httpMethod = "POST") diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzSupplierQualificationApplyController.java b/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzSupplierQualificationApplyController.java index 6b9725d57..44165dace 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzSupplierQualificationApplyController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/controller/XzSupplierQualificationApplyController.java @@ -1,11 +1,39 @@ package com.zhgd.xmgl.modules.xz.controller; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; +import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; +import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl; +import com.zhgd.xmgl.modules.project.entity.ProjectEnterprise; +import com.zhgd.xmgl.modules.project.service.impl.ProjectEnterpriseServiceImpl; +import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; +import com.zhgd.xmgl.modules.worker.entity.EnterpriseQualification; +import com.zhgd.xmgl.modules.worker.entity.ProjectEnterpriseSupplierInfo; +import com.zhgd.xmgl.modules.worker.service.IProjectEnterpriseSupplierInfoService; +import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseInfoServiceImpl; +import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseQualificationServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzSupplierQualificationApply; +import com.zhgd.xmgl.modules.xz.entity.XzSupplierQualificationRecord; +import com.zhgd.xmgl.modules.xz.entity.XzSupplierRecord; import com.zhgd.xmgl.modules.xz.entity.vo.XzSupplierQualificationApplyDto; import com.zhgd.xmgl.modules.xz.service.IXzSupplierQualificationApplyService; +import com.zhgd.xmgl.modules.xz.service.IXzSupplierQualificationRecordService; +import com.zhgd.xmgl.modules.xz.service.impl.XzSupplierRecordServiceImpl; +import com.zhgd.xmgl.security.JwtTokenProvider; +import com.zhgd.xmgl.util.EmailUtils; +import com.zhgd.xmgl.util.FlowUtil; +import com.zhgd.xmgl.util.MessageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -14,11 +42,15 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; -import java.util.HashMap; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** @@ -33,8 +65,43 @@ import java.util.List; @Slf4j @Api(tags = "星纵-承包商-入场申请相关Api") public class XzSupplierQualificationApplyController { + @Lazy + @Autowired + IProjectEnterpriseSupplierInfoService projectEnterpriseSupplierInfoService; + @Lazy + @Autowired + IXzSupplierQualificationRecordService xzSupplierQualificationRecordService; + @Lazy + @Autowired + XzSupplierRecordServiceImpl xzSupplierRecordService; + @Lazy + @Autowired + NoticeServiceImpl noticeService; + @Lazy + @Autowired + ProjectEnterpriseServiceImpl projectEnterpriseService; + @Lazy + @Autowired + private EnterpriseQualificationServiceImpl enterpriseQualificationService; @Autowired private IXzSupplierQualificationApplyService xzSupplierQualificationApplyService; + @Lazy + @Autowired + private EnterpriseInfoServiceImpl enterpriseInfoService; + @Lazy + @Autowired + private EmailUtils emailUtils; + @Lazy + @Autowired + private ISystemUserService systemUserService; + @Lazy + @Autowired + private AuthenticationManager authenticationManager; + @Lazy + @Autowired + private JwtTokenProvider jwtTokenProvider; + @Value("${supplierResubmitApplicationUrl}") + private String supplierResubmitApplicationUrl; /** * 分页列表查询 @@ -136,6 +203,263 @@ public class XzSupplierQualificationApplyController { return Result.ok(); } + @OperLog(operModul = "承包商-入场申请管理", operType = "编辑", operDesc = "工作流保存承包商-入场申请") + @ApiOperation(value = "工作流保存星纵-承包商-入场申请信息", notes = "工作流保存星纵-承包商-入场申请信息", httpMethod = "POST") + @PostMapping(value = "/flow/saveInfo") + public Result saveInfoFromFlow(@RequestBody Map map) { + String paramStr = JSON.toJSONString(map); + log.info("工作流保存星纵承包商入场申请信息:{}", paramStr); + String instanceId = MapUtils.getString(map, "instanceId"); + String title = "承包商入场申请"; + try { + String enterpriseName = MapUtils.getString(map, "enterpriseName"); + String description = MapUtils.getString(map, "description"); + String enterpriseAddress = MapUtils.getString(map, "enterpriseAddress"); + String enterpriseLegalPerson = MapUtils.getString(map, "enterpriseLegalPerson"); + String legalPersonIdCard = MapUtils.getString(map, "legalPersonIdCard"); + String enterpriseSafeAllow = MapUtils.getString(map, "enterpriseSafeAllow"); + String legalPersonTel = MapUtils.getString(map, "legalPersonTel"); + String socialCode = MapUtils.getString(map, "socialCode"); + String businessNumber = MapUtils.getString(map, "businessNumber"); + String qualificationNumber = MapUtils.getString(map, "qualificationNumber"); + String enterpriseEmail = MapUtils.getString(map, "enterpriseEmail"); + String registeredCapital = MapUtils.getString(map, "registeredCapital"); + String bankname = MapUtils.getString(map, "bankname"); + String bankcardnumber = MapUtils.getString(map, "bankcardnumber"); + String bankcode = MapUtils.getString(map, "bankcode"); + String enterpriseQualificationUrl = FlowUtil.getFileUrlWithHost(map, "enterpriseQualificationUrl"); + String businessLicenseEndDate = MapUtils.getString(map, "businessLicenseEndDate"); + String registerPersonName = MapUtils.getString(map, "registerPersonName"); + String registerPersonPhoneTel = MapUtils.getString(map, "registerPersonPhoneTel"); + String enterpriseSn = MapUtils.getString(map, "enterpriseSn"); + String logo = FlowUtil.getFileUrl(map, "logo"); + String registDate = MapUtils.getString(map, "registDate"); + String businessLicenseUrl = FlowUtil.getFileUrl(map, "businessLicenseUrl"); + String projectDirectorName = MapUtils.getString(map, "projectDirectorName"); + String projectDirectorPhone = MapUtils.getString(map, "projectDirectorPhone"); + String projectSn = MapUtils.getString(map, "projectSn"); + String noticeEmail = MapUtils.getString(map, "noticeEmail"); + String ancestors = MapUtils.getString(map, "ancestors"); + Long enterpriseTypeId = Optional.ofNullable(map.get("enterpriseTypeId")).map(o -> Convert.toLong(((List) o).get(0))).orElse(null); + Long parentEnterpriseId = FlowUtil.getPullDownLong(map, "parentEnterpriseId"); + Integer enterpriseProperty = Optional.ofNullable(map.get("enterpriseProperty")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + Integer applyStatus = MapUtils.getInteger(map, "applyStatus"); + String applyContent = Optional.ofNullable(map.get("applyContent")).map(o -> StrUtil.join(",", ((List) o).stream().map(o1 -> JSON.parseObject(o1.toString()).getString("text")).collect(Collectors.toList()))).orElse(null); + String applyUser = Optional.ofNullable(map.get("applyUser")).map(o -> { + List users = systemUserService.list(new LambdaQueryWrapper().in(SystemUser::getUserId, ((List) o).stream().distinct().collect(Collectors.toList()))); + if (CollUtil.isEmpty(users)) { + return ""; + } + return StrUtil.join(",", users.stream().map(SystemUser::getRealName).collect(Collectors.toList())); + }).orElse(""); + +// XzSupplierQualificationApply apply = new XzSupplierQualificationApply(); +// apply.setApplyTime(new Date()); +// apply.setProjectSn(projectSn); +// apply.setReplyTime(new Date()); +// apply.setApplyStatus(applyStatus); +// apply.setApplyUser(applyUser); +// apply.setApplyContent(applyContent); +// apply.setNoticeEmail(noticeEmail); +// xzSupplierQualificationApplyService.add(apply); + String sub = enterpriseName + "(信用代码:" + socialCode + ")"; + + List enterpriseSupplierInfos = Optional.ofNullable(map.get("enterpriseSupplierInfos")).map(o -> ((List) o)).orElse(null); + List qualificationRecords = Optional.ofNullable(map.get("qualificationRecords")).map(o -> ((List) o)).orElse(null); + List enterpriseSupplierInfoList = new ArrayList<>(); + if (CollUtil.isNotEmpty(enterpriseSupplierInfos)) { + for (Object supplierInfo : enterpriseSupplierInfos) { + Map map1 = (Map) supplierInfo; + String projectManage = MapUtils.getString(map1, "field1889813380500"); + String longitude = FlowUtil.getLongitude(map1, "field5527613416017"); + String latitude = FlowUtil.getLongitude(map1, "field5527613416017"); + String projectNumber = MapUtils.getString(map1, "field3597413394967"); + String projectAcreage = MapUtils.getString(map1, "field8382113460000"); + String startWorkDate = MapUtils.getString(map1, "field3279513473516"); + String projectTel = MapUtils.getString(map1, "field3163913488700"); + String layoutImage = FlowUtil.getJSONString(map1, "field7572613509085"); + String constructionMapUrl = FlowUtil.getJSONString(map1, "field7824213496616"); + String cbsName = MapUtils.getString(map1, "field4214913364183"); + String projectBuildArea = MapUtils.getString(map1, "field8585413374585"); + Integer projectType = Optional.ofNullable(map1.get("field5423413438783")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + Integer structureType = Optional.ofNullable(map1.get("field7147513453452")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + Integer bulidStatus = Optional.ofNullable(map1.get("field9109313465100")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + Integer constructionStage = Optional.ofNullable(map1.get("field7511013402167")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + Integer cbsProjectType = Optional.ofNullable(map1.get("field6358113386450")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + Date completionDate = Optional.ofNullable(map1.get("field5019213481082")).map(o -> DateUtil.parse(o.toString())).orElse(null); + + ProjectEnterpriseSupplierInfo enterpriseSupplierInfo = new ProjectEnterpriseSupplierInfo(); + enterpriseSupplierInfo.setProjectSn(projectSn); + enterpriseSupplierInfo.setProjectManage(projectManage); + enterpriseSupplierInfo.setLongitude(longitude); + enterpriseSupplierInfo.setLatitude(latitude); + enterpriseSupplierInfo.setProjectNumber(projectNumber); + enterpriseSupplierInfo.setProjectAcreage(projectAcreage); + enterpriseSupplierInfo.setStartWorkDate(startWorkDate); + enterpriseSupplierInfo.setProjectTel(projectTel); + enterpriseSupplierInfo.setProjectType(projectType); + enterpriseSupplierInfo.setStructureType(structureType); + enterpriseSupplierInfo.setBulidStatus(bulidStatus); + enterpriseSupplierInfo.setConstructionStage(constructionStage); + enterpriseSupplierInfo.setLayoutImage(layoutImage); + enterpriseSupplierInfo.setConstructionMapUrl(constructionMapUrl); + enterpriseSupplierInfo.setCbsName(cbsName); + enterpriseSupplierInfo.setProjectBuildArea(projectBuildArea); + enterpriseSupplierInfo.setCompletionDate(completionDate); + enterpriseSupplierInfo.setCbsProjectType(cbsProjectType); + enterpriseSupplierInfo.setType(2); +// enterpriseSupplierInfo.setXzSupplierQualificationApplyId(apply.getId()); + enterpriseSupplierInfoList.add(enterpriseSupplierInfo); + } + } + + List qualificationRecordList = new ArrayList<>(); + if (CollUtil.isNotEmpty(qualificationRecords)) { + for (Object qr : qualificationRecords) { + Map map1 = (Map) qr; + String fileName = MapUtils.getString(map1, "field1715913568733"); + String fileNumber = MapUtils.getString(map1, "field1910713590018"); + String fileUrl = FlowUtil.getFileUrl(map1, "field1080013606067"); + String remarks = MapUtils.getString(map1, "field2502513615584"); + String originFileName = FlowUtil.getFileOriginFileName(map1, "field1080013606067"); + Integer qualificationType = Optional.ofNullable(map1.get("field4809313565733")).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + + XzSupplierQualificationRecord qualificationRecord = new XzSupplierQualificationRecord(); +// qualificationRecord.setXzSupplierQualificationApplyId(apply.getId()); + qualificationRecord.setFileName(fileName); + qualificationRecord.setFileNumber(fileNumber); + qualificationRecord.setFileUrl(fileUrl); + qualificationRecord.setRemarks(remarks); + qualificationRecord.setOriginFileName(originFileName); + qualificationRecord.setQualificationType(qualificationType); + qualificationRecordList.add(qualificationRecord); + } + } + + EnterpriseInfo existEnterpriseInfo = enterpriseInfoService.getOne(new LambdaQueryWrapper().eq(EnterpriseInfo::getSocialCode, socialCode)); + if (existEnterpriseInfo != null) { + List projectEnterpriseList = projectEnterpriseService.list(new LambdaQueryWrapper() + .eq(ProjectEnterprise::getEnterpriseId, existEnterpriseInfo.getId()) + .eq(ProjectEnterprise::getProjectSn, projectSn)); + if (CollUtil.isNotEmpty(projectEnterpriseList)) { + String msg = sub + "已存在"; + noticeService.addProjectLevelNotice(projectSn, title, msg, "1", null); + emailUtils.sendSimpleMail(noticeEmail, sub + "入场审批不通过", msg); + return Result.ok(); + } + } + +// List mustHave = Arrays.asList(1, 2, 3); +// Set set = qualificationRecordList.stream().filter(x -> mustHave.contains(x.getQualificationType())).map(XzSupplierQualificationRecord::getQualificationType).collect(Collectors.toSet()); +// int i = 3; +// if (CollUtil.isEmpty(qualificationRecordList) || set.size() < i) { +// throw new OpenAlertException("资质文件的资质类型的(安全协议、劳务分包合同、施工合同必须都要上传"); +// } + +// List supplierApprovalList = xzSupplierQualificationApplyService.getSupplierApprovalList(projectSn, socialCode); +// long c1 = supplierApprovalList.stream().filter(apply1 -> Objects.equals(apply1.getApplyStatus(), 1)).count(); +// if (c1 > 0) { +// String msg = "该承包商(信用代码:" + socialCode + ")待审核中"; +// noticeService.addProjectLevelNotice(projectSn, "承包商入场审核", msg, "1", null); +// return Result.ok(); +// } +// long c2 = supplierApprovalList.stream().filter(apply1 -> Objects.equals(apply1.getApplyStatus(), 2)).count(); +// if (c2 > 0) { +// String msg = "该承包商(信用代码:" + socialCode + ")已审核通过"; +// noticeService.addProjectLevelNotice(projectSn, "承包商入场审核", msg, "1", null); +// return Result.ok(); +// } + + XzSupplierRecord supplierRecord = new XzSupplierRecord(); + supplierRecord.setEnterpriseName(enterpriseName); + supplierRecord.setDescription(description); + supplierRecord.setEnterpriseAddress(enterpriseAddress); + supplierRecord.setEnterpriseLegalPerson(enterpriseLegalPerson); + supplierRecord.setLegalPersonIdCard(legalPersonIdCard); + supplierRecord.setEnterpriseSafeAllow(enterpriseSafeAllow); + supplierRecord.setEnterpriseProperty(enterpriseProperty); + supplierRecord.setLegalPersonTel(legalPersonTel); + supplierRecord.setSocialCode(socialCode); + supplierRecord.setBusinessNumber(businessNumber); + supplierRecord.setQualificationNumber(qualificationNumber); + supplierRecord.setEnterpriseEmail(enterpriseEmail); + supplierRecord.setRegisteredCapital(registeredCapital); + supplierRecord.setBankname(bankname); + supplierRecord.setBankcardnumber(bankcardnumber); + supplierRecord.setBankcode(bankcode); + supplierRecord.setEnterpriseQualificationUrl(enterpriseQualificationUrl); + supplierRecord.setBusinessLicenseEndDate(businessLicenseEndDate); + supplierRecord.setRegisterPersonName(registerPersonName); + supplierRecord.setRegisterPersonPhoneTel(registerPersonPhoneTel); + supplierRecord.setEnterpriseSn(enterpriseSn); + supplierRecord.setLogo(logo); + supplierRecord.setRegistDate(registDate); + supplierRecord.setBusinessLicenseUrl(businessLicenseUrl); +// supplierRecord.setXzSupplierQualificationApplyId(apply.getId()); + supplierRecord.setEnterpriseTypeId(enterpriseTypeId); + supplierRecord.setProjectDirectorName(projectDirectorName); + supplierRecord.setProjectDirectorPhone(projectDirectorPhone); + supplierRecord.setAncestors(ancestors); + supplierRecord.setType(1); + supplierRecord.setParentEnterpriseId(parentEnterpriseId); + supplierRecord.setSortNum(0); + supplierRecord.setDepartmentType(2); + xzSupplierRecordService.save(supplierRecord); + +// if (CollUtil.isNotEmpty(qualificationRecords)) { +// xzSupplierQualificationRecordService.saveBatch(qualificationRecordList); +// } + + String url = supplierResubmitApplicationUrl + "?token=" + getFlowStartUserToken().getResult() + "&sn=" + projectSn + "&instanceId=" + instanceId; + if (Objects.equals(applyStatus, 2)) { + //通过,添加到正式的数据中 + EnterpriseInfo enterpriseInfo = BeanUtil.copyProperties(supplierRecord, EnterpriseInfo.class); + enterpriseInfo.setProjectSn(projectSn); + try { + enterpriseInfoService.saveEnterpriseInfo(enterpriseInfo); + } catch (OpenAlertException e) { + log.error("工作流保存星纵承包商入场申请信息校验异常:", e); + noticeService.addProjectLevelNotice(projectSn, title, sub + "审核不通过," + e.getMessage(), "1", null); + emailUtils.sendSimpleMail(noticeEmail, sub + "入场审批不通过", + StrUtil.format(e.getMessage() + ",重新提交申请链接(点击链接补充资质):{}", applyContent, url)); + return Result.ok(); + } + if (CollUtil.isNotEmpty(qualificationRecordList)) { + List copyToList = BeanUtil.copyToList(qualificationRecordList, EnterpriseQualification.class); + for (EnterpriseQualification qualification : copyToList) { + qualification.setId(null); + qualification.setEnterpriseId(enterpriseInfo.getId()); + } + enterpriseQualificationService.saveBatch(copyToList); + } + if (CollUtil.isNotEmpty(enterpriseSupplierInfos)) { + enterpriseSupplierInfoList.stream().forEach(projectEnterpriseSupplierInfo -> projectEnterpriseSupplierInfo.setEnterpriseId(enterpriseInfo.getId())); +// projectEnterpriseSupplierInfoService.saveBatch(enterpriseSupplierInfoList); + List copyToList = BeanUtil.copyToList(enterpriseSupplierInfoList, ProjectEnterpriseSupplierInfo.class); + for (ProjectEnterpriseSupplierInfo info : copyToList) { + info.setId(null); + info.setXzSupplierQualificationApplyId(null); + info.setType(2); + info.setEnterpriseId(enterpriseInfo.getId()); + } + projectEnterpriseSupplierInfoService.saveBatch(copyToList); + } + noticeService.addProjectLevelNotice(projectSn, title, sub + "审核通过", "1", null); + emailUtils.sendSimpleMail(noticeEmail, sub + "入场审批通过", sub + "入场审批通过"); + } else if (Objects.equals(applyStatus, 3)) { + //驳回 + String msg = sub + "审核不通过"; + noticeService.addProjectLevelNotice(projectSn, title, msg, "1", null); + emailUtils.sendSimpleMail(noticeEmail, sub + "入场审批不通过", + StrUtil.format(msg + ",审批回复:{}\r\n重新提交申请链接(点击链接补充资质):{}", applyContent, url)); + } + } catch (Exception e) { + log.error("工作流保存星纵承包商入场申请信息异常:", e); +// emailUtils.saveExceptionAndSendFlowEmail(paramStr, e, "工作流保存星纵承包商入场申请信息异常", "/xmgl/xzSupplierQualificationApply/flow/saveInfo", instanceId); + } + return Result.ok(); + } + @OperLog(operModul = "承包商-入场申请管理", operType = "审批通过", operDesc = "审批通过") @ApiOperation(value = "审批通过", notes = "审批通过", httpMethod = "POST") @PostMapping(value = "/pass") @@ -152,5 +476,19 @@ public class XzSupplierQualificationApplyController { return Result.ok(); } + @OperLog(operModul = "承包商-入场申请管理", operType = "查询", operDesc = "工作流发起人的查询token") + @ApiOperation(value = "工作流发起人的查询token", notes = "工作流发起人的查询token", httpMethod = "GET") + @GetMapping(value = "/flow/start/token") + public Result getFlowStartUserToken() { + String account = "工作流发起人勿删"; + SystemUser systemUser = systemUserService.getOne(new LambdaUpdateWrapper().eq(SystemUser::getAccount, account)); + if (systemUser == null) { + throw new OpenAlertException(MessageUtil.get("notFindErr")); + } + authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(systemUser.getAccount(), systemUser.getShowPassword())); + String token = jwtTokenProvider.createToken(systemUser.getAccount(), 60 * 60 * 24); + return Result.success(token); + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityRectifyRecord.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityRectifyRecord.java index 47c05d57a..0b499988b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityRectifyRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityRectifyRecord.java @@ -83,7 +83,7 @@ public class XzSecurityQualityRectifyRecord implements Serializable { */ @Excel(name = "违章人员", width = 15) @ApiModelProperty(value = "违章人员") - private Long violatorId; + private String violatorId; @TableField(exist = false) private String realName; diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScore.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScore.java deleted file mode 100644 index 8cf30d874..000000000 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScore.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.zhgd.xmgl.modules.xz.security.entity.vo; - -import lombok.Data; - -import java.math.BigDecimal; - -@Data -public -class FiveScore { - private BigDecimal aqgl; - private BigDecimal wmsg; - private BigDecimal sgzj; - private BigDecimal gcqx; - private BigDecimal wxzy; -} diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScoresVo.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScoresVo.java index b496fea40..69e4ce6db 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScoresVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/FiveScoresVo.java @@ -10,5 +10,5 @@ class FiveScoresVo { private BigDecimal monthScore; private BigDecimal lastMonthScore; private BigDecimal differScoreRate; - private FiveScore thisMonthScores; + private TenScore thisMonthScores; } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/TenScore.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/TenScore.java new file mode 100644 index 000000000..b5713bd78 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/vo/TenScore.java @@ -0,0 +1,31 @@ +package com.zhgd.xmgl.modules.xz.security.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public +class TenScore { + @ApiModelProperty("安全管理") + private BigDecimal aqgl; + @ApiModelProperty("文明施工") + private BigDecimal wmsg; + @ApiModelProperty("脚手架") + private BigDecimal jsj; + @ApiModelProperty("基坑工程") + private BigDecimal jkgc; + @ApiModelProperty("模板支架") + private BigDecimal mbzj; + @ApiModelProperty("物料提升机") + private BigDecimal wltsj; + @ApiModelProperty("塔式起重机") + private BigDecimal tsqzj; + @ApiModelProperty("高处作业") + private BigDecimal gczy; + @ApiModelProperty("施工用电") + private BigDecimal sgyd; + @ApiModelProperty("施工机具") + private BigDecimal sgjj; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityRectifyRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityRectifyRecordServiceImpl.java index 3c68bbc45..49b668b55 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityRectifyRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityRectifyRecordServiceImpl.java @@ -17,7 +17,6 @@ import com.gexin.fastjson.JSONObject; import com.zhgd.redis.lock.redisson.DistributedLock; import com.zhgd.xmgl.call.SanjiangDataCall; import com.zhgd.xmgl.constant.Cts; -import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.basicdata.service.impl.SystemUserServiceImpl; @@ -209,33 +208,35 @@ public class XzSecurityQualityRectifyRecordServiceImpl extends ServiceImpl map = new HashMap<>(16); + map.put("id", workerInfo.getId()); + map.put("deductScore", ds); + workerInfoService.updateScoreSendAuth(map); + + //存记录 + XzDeductScoreRecord vo = new XzDeductScoreRecord(); + vo.setProjectSn(hiddenDangerInspectRecord.getProjectSn()); + vo.setWorkerId(workerInfo.getId()); + vo.setTypeName(item.getContent()); + vo.setDeductScore(-item.getDeductScore()); + vo.setType(1); + vo.setCreateDate(new Date()); + vo.setCurScore(workerInfo.getSafeScore() - item.getDeductScore() >= 0 ? workerInfo.getSafeScore() - item.getDeductScore() : 0); + vo.setDeductReason(StrUtil.format("您在{}发现安全隐患({}-{})扣{}分", DateUtil.format(vo.getCreateDate(), "yyyy年MM月dd日HH:mm:ss"), "安全检査", vo.getTypeName() == null ? "无" : vo.getTypeName(), item.getDeductScore())); + vo.setTypeTableId(hiddenDangerInspectRecord.getId()); + xzDeductScoreRecordMapper.insert(vo); } - - //扣分 - HashMap map = new HashMap<>(16); - map.put("id", workerInfo.getId()); - map.put("deductScore", ds); - workerInfoService.updateScoreSendAuth(map); - - //存记录 - XzDeductScoreRecord vo = new XzDeductScoreRecord(); - vo.setProjectSn(hiddenDangerInspectRecord.getProjectSn()); - vo.setWorkerId(workerInfo.getId()); - vo.setTypeName(item.getContent()); - vo.setDeductScore(-item.getDeductScore()); - vo.setType(1); - vo.setCreateDate(new Date()); - vo.setCurScore(workerInfo.getSafeScore() - item.getDeductScore() >= 0 ? workerInfo.getSafeScore() - item.getDeductScore() : 0); - vo.setDeductReason(StrUtil.format("您在{}发现安全隐患({}-{})扣{}分", DateUtil.format(vo.getCreateDate(), "yyyy年MM月dd日HH:mm:ss"), "安全检査", vo.getTypeName() == null ? "无" : vo.getTypeName(), item.getDeductScore())); - vo.setTypeTableId(hiddenDangerInspectRecord.getId()); - xzDeductScoreRecordMapper.insert(vo); } @Override diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/service/IXzSupplierQualificationApplyService.java b/src/main/java/com/zhgd/xmgl/modules/xz/service/IXzSupplierQualificationApplyService.java index 167431b1b..e72d43817 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/service/IXzSupplierQualificationApplyService.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/service/IXzSupplierQualificationApplyService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.zhgd.xmgl.modules.xz.entity.XzSupplierQualificationApply; import com.zhgd.xmgl.modules.xz.entity.vo.XzSupplierQualificationApplyDto; +import org.apache.ibatis.annotations.Param; import java.util.HashMap; import java.util.List; @@ -72,4 +73,13 @@ public interface IXzSupplierQualificationApplyService extends IService getSupplierApprovalList(String projectSn, String socialCode); + } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java index a10d3ef94..737b6b9d5 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/service/impl/XzSupplierQualificationApplyServiceImpl.java @@ -287,4 +287,9 @@ public class XzSupplierQualificationApplyServiceImpl extends ServiceImpl getSupplierApprovalList(String projectSn, String socialCode) { + return baseMapper.getSupplierApprovalList(projectSn, socialCode); + } + } diff --git a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java index b74877e16..68f7b1653 100644 --- a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java +++ b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java @@ -80,6 +80,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { http.authorizeRequests() //请求路径允许访问 + .antMatchers("/xmgl/constructionEquipmentTool/flow/add").permitAll() + .antMatchers("/xmgl/xzSupplierQualificationApply/flow/start/token").permitAll() + .antMatchers("/xmgl/xzSupplierQualificationApply/flow/saveInfo").permitAll() .antMatchers("/xmgl/pouringOrderLedger/flow/add").permitAll() .antMatchers("/xmgl/qualityCommonProblemRecord/flow/add").permitAll() .antMatchers("/xmgl/liftingOperation/flow/add").permitAll() diff --git a/src/main/java/com/zhgd/xmgl/util/FlowUtil.java b/src/main/java/com/zhgd/xmgl/util/FlowUtil.java new file mode 100644 index 000000000..e73bb9b7d --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/FlowUtil.java @@ -0,0 +1,88 @@ +package com.zhgd.xmgl.util; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import org.apache.commons.collections.MapUtils; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class FlowUtil { + + + /** + * 获取文件url + * + * @param map + * @param key + * @return + */ + public static String getFileUrl(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> ((Map) ((List) o).get(0)).get("url").toString()).orElse(null); + } + + /** + * 获取文件url完整链接 + * + * @param map + * @param key + * @return + */ + public static String getFileUrlWithHost(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> PathUtil.getServerUrl() + "/image/" + ((Map) ((List) o).get(0)).get("url").toString()).orElse(null); + } + + /** + * 获取文件原来的名称 + * + * @param map + * @param key + * @return + */ + public static String getFileOriginFileName(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> ((Map) ((List) o).get(0)).get("name").toString()).orElse(null); + } + + /** + * 获取下拉Long + * + * @param map + * @param key + * @return + */ + public static Long getPullDownLong(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> Convert.toLong(((List) o).get(0))).orElse(null); + } + + public static Date getDate(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> DateUtil.parse(o.toString())).orElse(null); + } + + public static String getJSONString(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(JSON::toJSONString).orElse(null); + } + + public static List getList(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> ((List) o)).orElse(null); + } + + public static String getString(Map map, String key) { + return MapUtils.getString(map, key); + } + + public static Integer getPullDownInteger(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> Convert.toInt(((List) o).get(0))).orElse(null); + } + + public static String getLongitude(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> JSON.parseObject(o.toString()).getString("lng")).orElse(null); + } + + public static String getLatitude(Map map, String key) { + return Optional.ofNullable(map.get(key)).map(o -> JSON.parseObject(o.toString()).getString("lat")).orElse(null); + } + +} diff --git a/src/main/java/com/zhgd/xmgl/util/PathUtil.java b/src/main/java/com/zhgd/xmgl/util/PathUtil.java index cd774d541..7209289c8 100644 --- a/src/main/java/com/zhgd/xmgl/util/PathUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/PathUtil.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; public class PathUtil { private static String basePath; + private static String serverUrl; /** * 删除多余的斜杠 @@ -18,6 +19,25 @@ public class PathUtil { return path.replaceAll("([^:])(//+)", "$1/"); } + public static String getBasePath() { + return StrUtil.removeSuffix(basePath, "/"); + } + + @Value("${basePath}") + public void setBasePath(String basePath) { + PathUtil.basePath = basePath; + } + + public static String getServerUrl() { + return StrUtil.removeSuffix(serverUrl, "/"); + } + + @Value("${serverUrl}") + public void setServerUrl(String serverUrl) { + PathUtil.serverUrl = serverUrl; + } + + public static void main(String[] args) { System.out.println(reviseSlash("/home//foo/")); System.out.println(reviseSlash("/home/foo/")); @@ -27,12 +47,4 @@ public class PathUtil { System.out.println(reviseSlash("http://192.168.34.221:9111/image//65e5733735f013f4cc322278.jpg")); } - public static String getBasePath() { - return StrUtil.removeSuffix(basePath, "/"); - } - - @Value("${basePath}") - public void setBasePath(String basePath) { - PathUtil.basePath = basePath; - } } diff --git a/src/main/resources/application-gsx-t-dev.properties b/src/main/resources/application-gsx-t-dev.properties index 1ed12256f..a8b4404b5 100644 --- a/src/main/resources/application-gsx-t-dev.properties +++ b/src/main/resources/application-gsx-t-dev.properties @@ -100,3 +100,5 @@ magic-api.resource.location=C:/jxj/prod/backEnd/itbgpImage/data/magic-api upload.image.url.prefix=http://182.90.224.237:51234/image/ #内网的服务图片的url前缀 xingzong.inner.upload.image.url.prefix=http://10.168.2.104:9809/image/ +#承包商重新提交申请链接(点击链接补充资质) +supplierResubmitApplicationUrl=http://192.168.34.175:88/#/workspace/contractorApply diff --git a/src/main/resources/lib/wflow-server-1.0-SNAPSHOT.jar b/src/main/resources/lib/wflow-server-1.0-SNAPSHOT.jar index 997c0b23a331a7e535c27b79161a64fb397f0752..8950d278043098bc5c0bd1ec55b93735c4e157ca 100644 GIT binary patch delta 23010 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�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 ACjbBd delta 22606 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 GO#cVJZ%%Xo