丢失报备

This commit is contained in:
mashuai 2025-11-28 16:21:57 +08:00
parent 1cdae3a38b
commit 9f59f802ca
15 changed files with 2319 additions and 13 deletions

View File

@ -43,7 +43,10 @@ public enum TmTaskTypeEnum {
TM_TASK_MATERIAL_BACK_APPOINT(24, "材料站预约退料任务"),
// 材料站站内直转任务
TM_TASK_ZN_DIRECT(25, "材料站站内直转任务");
TM_TASK_ZN_DIRECT(25, "材料站站内直转任务"),
// 丢失报备任务
TM_TASK_LOSS_REPORT(26, "丢失报备任务");

View File

@ -421,10 +421,10 @@ public class ClzDirectServiceImpl implements ClzDirectService {
// 如果该任务类型配置了一个审批流则直接使用
sysWorkflowType = sysWorkflowTypeList.get(0);
// 先根据id查询该数据是否已经存在
recordInfo = sysWorkflowRecordMapper.getWorkflowRecordHistory(event.getTaskId());
recordInfo = sysWorkflowRecordMapper.getWorkflowRecordHistory(event);
// 根据id删除该数据
if (recordInfo != null) {
sysWorkflowRecordMapper.deleteSysWorkflowRecord(event.getTaskId());
sysWorkflowRecordMapper.deleteSysWorkflowRecord(event);
}
sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setWorkflowId(sysWorkflowType.getId());

View File

@ -2055,7 +2055,7 @@ public class LeaseApplyInfoServiceImpl implements ILeaseApplyInfoService {
if (leaseApplyInfo.getMaId() != null) {
// 过滤出list中和leaseApplyInfo.getMaId()相等的元素
list = list.stream()
.filter(item -> item.getMaId().equals(leaseApplyInfo.getMaId()))
.filter(item -> item.getMaId() != null && item.getMaId().equals(leaseApplyInfo.getMaId()))
.collect(Collectors.toList());
}
}

View File

@ -1325,10 +1325,10 @@ public class LeaseTaskServiceImpl implements ILeaseTaskService {
if (leaseApplyDetails.getTaskId()!= null) {
LeaseOutDetails leaseOutDetails = new LeaseOutDetails();
leaseOutDetails.setTaskId(leaseApplyDetails.getTaskId()+"");
res = editTaskStatus(leaseOutDetails);
/*res = editTaskStatus(leaseOutDetails);
if (res == GlobalConstants.INT_0) {
throw new RuntimeException("出库退回失败,修改任务状态失败");
}
}*/
}
// 删除领料出库明细表lease_out_details
int res2 = mapper.deleteLeaseOutDetails(leaseApplyDetails);

View File

@ -0,0 +1,210 @@
package com.bonus.material.lossAssessment.controller;
import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.material.lossAssessment.domain.LossAssignInfo;
import com.bonus.material.lossAssessment.domain.LossAssignVo;
import com.bonus.material.lossAssessment.service.LossAssignService;
import com.bonus.material.ma.domain.Type;
import com.bonus.material.settlement.domain.SltAgreementInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;
/**
* @author ma_sh
*/
@RestController
@RequestMapping("/LossAssign")
@Api(tags = "设备报备丢失管理")
@Slf4j
public class LossAssignController extends BaseController {
@Resource
private LossAssignService service;
/**
* 丢失报备查询列表
* @param lossAssignInfo
* @return
*/
@ApiOperation(value = "丢失报备查询列表")
@GetMapping("/list")
public AjaxResult list(LossAssignInfo lossAssignInfo) {
startPage();
try {
List<LossAssignInfo> directApplyInfos = service.getList(lossAssignInfo);
return AjaxResult.success(getDataTable(directApplyInfos));
} catch (Exception e) {
return AjaxResult.success(getDataTable(new ArrayList<>()));
}
}
/**
* 导出丢失报备查询列表
* @param response
* @param lossAssignInfo
*/
@PostMapping("/export")
public void export(HttpServletResponse response, LossAssignInfo lossAssignInfo) {
String fileName = "报备丢失记录";
if (lossAssignInfo.getStartTime() != null && lossAssignInfo.getEndTime() != null) {
fileName = "报备丢失"+ "(报备时间" + lossAssignInfo.getStartTime() + "" + lossAssignInfo.getEndTime()+ "";
}
List<LossAssignInfo> list = service.getList(lossAssignInfo);
// 根据list集合数去填充序号
for (int i = 0; i < list.size(); i++) {
list.get(i).setSerialNumber(i + 1);
}
ExcelUtil<LossAssignInfo> util = new ExcelUtil<>(LossAssignInfo.class);
// 获取当前年月日时分秒导出时间用括号拼接在后面
String title = "报备丢失记录" + "" + "导出时间:" + DateUtils.getTime() + "";
util.exportExcel(response, list, fileName, title);
}
/**
* 根据协议Id查询在用数据
* @param sltAgreementInfo
* @return
*/
@ApiOperation(value = "根据协议Id查询在用数据")
@GetMapping("/getUseData")
public AjaxResult getUseData(SltAgreementInfo sltAgreementInfo) {
try {
List<SltAgreementInfo> useData = service.getUseData(sltAgreementInfo);
// 1. 批量查询待审核数量收集所有必要参数一次查库
Set<SltAgreementInfo> pairSet = new HashSet<>();
for (SltAgreementInfo data : useData) {
Long typeId = data.getTypeId();
Long maId = data.getMaId();
SltAgreementInfo info = new SltAgreementInfo();
info.setTypeId(typeId);
info.setMaId(maId);
pairSet.add(info);
}
List<SltAgreementInfo> pairs = new ArrayList<>(pairSet);
// 2.批量查询待转数量
List<SltAgreementInfo> batchInfoList = service.getBatchInfo(sltAgreementInfo.getAgreementId(),pairs);
// 构建infoMapkey = "typeId:maId"value = 对应的SltAgreementInfo含waitTransNum
Map<String, SltAgreementInfo> infoMap = new HashMap<>();
for (SltAgreementInfo info : batchInfoList) {
Long typeId = info.getTypeId();
Long maId = info.getMaId();
// 生成唯一key处理maId为null的情况
String key = typeId + ":" + (maId == null ? "null" : maId);
infoMap.put(key, info);
}
// 3. 遍历useData处理逻辑用批量结果替代循环查库
for (SltAgreementInfo data : useData) {
// 4. 从批量查询结果中获取数据O(1)查询
String infoKey = data.getTypeId() + ":" + (data.getMaId() == null ? "null" : data.getMaId());
SltAgreementInfo info = infoMap.get(infoKey);
if (info != null) {
data.setWaitTransNum(info.getWaitTransNum());
data.setTransNum(data.getUseNum().subtract(info.getWaitTransNum()));
} else {
data.setWaitTransNum(BigDecimal.ZERO);
data.setTransNum(data.getUseNum());
}
}
return AjaxResult.success(useData);
} catch (Exception e) {
log.error("查询失败", e);
return AjaxResult.success(new ArrayList<>());
}
}
/**
* 查询物资类型3级--前端联动式下拉框(在用设备)
* 没有4级规格型号
*/
@ApiOperation(value = "获取物资类型连动式下拉框")
@GetMapping("/equipmentThreeTypes")
public AjaxResult equipmentThreeTypes(@RequestParam(required = false) Long typeId, @RequestParam(required = false) Long agreementId) {
List<Type> listByMaType = service.getEquipmentThreeTypes(typeId, agreementId);
return success(listByMaType);
}
/**
* 新增申请
* @param lossAssignVo
* @return
*/
@ApiOperation(value = "新增申请")
@PostMapping("/add")
public AjaxResult add(@RequestBody LossAssignVo lossAssignVo) {
try {
return service.add(lossAssignVo);
} catch (Exception e) {
System.err.println("保存失败:" + e.getMessage());
return AjaxResult.error("保存失败");
}
}
/**
* 修改申请
* @param lossAssignVo
* @return
*/
@ApiOperation(value = "修改申请")
@PostMapping("/edit")
public AjaxResult edit(@RequestBody LossAssignVo lossAssignVo) {
try {
return service.edit(lossAssignVo);
} catch (Exception e) {
return AjaxResult.error("修改失败");
}
}
/**
* 删除申请
* @param lossAssignInfo
* @return
*/
@ApiOperation(value = "删除申请")
@PostMapping("/delete")
public AjaxResult remove(@RequestBody LossAssignInfo lossAssignInfo) {
return service.remove(lossAssignInfo);
}
/**
* 查看详情
* @param lossAssignInfo
* @return
*/
@ApiOperation(value = "查看详情")
@GetMapping("/getInfo")
public AjaxResult getInfo(LossAssignInfo lossAssignInfo) {
try {
return service.getInfoById(lossAssignInfo);
} catch (Exception e) {
return AjaxResult.success(new LossAssignVo());
}
}
/**
* 报备丢失审批
* @param lossAssignInfo
* @return
*/
@ApiOperation(value = "报备丢失审批")
@PostMapping("/directUpdate")
public AjaxResult directUpdate(@RequestBody LossAssignInfo lossAssignInfo) {
try {
return service.updateDirectSysWorkflowRecordHistory(lossAssignInfo);
} catch (Exception e) {
logger.error("审核失败{}", e.getMessage(), e);
return error(e.getMessage());
}
}
}

View File

@ -0,0 +1,84 @@
package com.bonus.material.lossAssessment.domain;
import com.bonus.common.core.web.domain.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
* 设备报备丢失details
* @author ma_sh
*/
@EqualsAndHashCode(callSuper = false)
@Data
@Accessors(chain = true)
public class LossAssignDetails extends BaseEntity {
/**
* id
*/
private Integer id;
/**
* 报表丢失主表id
*/
private Integer lossId;
/**
* 设备类型id
*/
private Long typeId;
/**
* 设备id
*/
private Long maId;
/**
* 设备编码
*/
private String maCode;
/**
* 丢失数量
*/
private BigDecimal lossNum;
@ApiModelProperty(value = "领料时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date startTime;
@ApiModelProperty(value = "领料人")
private String leasePerson;
/**
* 设备名称
*/
private String typeName;
/**
* 规格型号
*/
private String typeModelName;
/**
* 计量单位
*/
private String unitName;
@ApiModelProperty(value = "在用数量")
private BigDecimal useNum;
@ApiModelProperty(value = "待转数量")
private BigDecimal waitTransNum;
@ApiModelProperty(value = "可转数量")
private BigDecimal transNum;
@ApiModelProperty(value = "报表丢失协议")
private Integer agreementId;
}

View File

@ -0,0 +1,163 @@
package com.bonus.material.lossAssessment.domain;
import com.bonus.common.core.annotation.Excel;
import com.bonus.material.ma.domain.DirectApplyUrl;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
* 设备报备丢失info
* @author ma_sh
*/
@EqualsAndHashCode(callSuper = false)
@Data
@Accessors(chain = true)
public class LossAssignInfo {
@ApiModelProperty(value = "序号")
@Excel(name = "序号", isSequence = true, sort = 0, width = 5)
private Integer serialNumber;
@ApiModelProperty(value = "下个流程节点id")
private Integer id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "申请时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Excel(name = "申请人")
private String createBy;
@ApiModelProperty(value = "报表丢失单号(DS20240226-1)")
@Excel(name = "报表丢失单号")
private String code;
@ApiModelProperty(value = "报表丢失协议")
private Integer agreementId;
@ApiModelProperty(value = "报表丢失单位id")
private String lossUnitId;
@Excel(name = "报备丢失单位名称")
private String lossUnitName;
@ApiModelProperty(value = "报表丢失工程id")
private String lossProId;
@Excel(name = "报备丢失工程名称", width = 40)
private String lossProName;
@ApiModelProperty(value = "报备丢失人")
private String lossMan;
@ApiModelProperty(value = "手机号")
private String lossPhone;
@Excel(name = "物资类型", width = 40)
private String typeName;
@ApiModelProperty(value = "直转附件数组")
private List<DirectApplyUrl> dirUrls;
@ApiModelProperty(value = "报备丢失备注")
private String lossRemark;
@ApiModelProperty(value = "修改人")
private String updateBy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "修改时间")
private Date updateTime;
@ApiModelProperty(value = "丢失附件")
private String lossUrl;
@Excel(name = "状态", readConverterExp = "0=待审核,1=审核中,2=已完成,3=已驳回")
private Integer status;
@ApiModelProperty(value = "审核人")
private String auditor;
@ApiModelProperty(value = "审核时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date auditTime;
@ApiModelProperty(value = "审核备注")
private String auditRemark;
private Integer isApp;
private Integer taskStatus;
private String flowStatus;
private String flowId;
@ApiModelProperty(value = "本流程节点id")
private Integer nodeId;
@ApiModelProperty(value = "下个流程节点id")
private Integer nextNodeId;
@ApiModelProperty(value = "流程配置值")
private String configValue;
@ApiModelProperty(value = "所属记录")
private Integer recordId;
@ApiModelProperty(value = "流程节点签名方式 0:或签 1:会签")
private Integer nodeSignType;
@ApiModelProperty(value = "开始时间")
private String startTime;
@ApiModelProperty(value = "结束时间")
private String endTime;
@ApiModelProperty(value = "任务状态列表")
private List<Integer> statusList;
@ApiModelProperty(value = "部门id")
private Integer deptId;
@ApiModelProperty(value = "报备丢失i8工程id")
private String lossExternalId;
@ApiModelProperty(value = "报备丢失分公司")
private String lossImpUnitName;
@ApiModelProperty(value = "报备丢失项目部")
private String lossDepartName;
@ApiModelProperty(value = "审批结果1通过 2拒绝")
private Integer isAccept;
@ApiModelProperty(value = "审批人id")
private String directUserIds;
@ApiModelProperty(value = "用户id")
private Long userId;
@ApiModelProperty(value = "i8工程id集合")
private List<String> projectIdList;
@ApiModelProperty(value = "实施单位id")
private String impUnit;
@ApiModelProperty(value = "班组长身份证id")
private String bzIdCard;
@ApiModelProperty(value = "关键字")
private String keyWord;
@ApiModelProperty(value = "审批结果")
private String remark;
}

View File

@ -0,0 +1,19 @@
package com.bonus.material.lossAssessment.domain;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @Author ma_sh
* @create 2025/11/26 15:10
*/
@EqualsAndHashCode(callSuper = false)
@Data
public class LossAssignVo {
private LossAssignInfo lossAssignInfo;
private List<LossAssignDetails> lossAssignDetails;
}

View File

@ -0,0 +1,195 @@
package com.bonus.material.lossAssessment.mapper;
import com.bonus.common.biz.domain.lease.WorkApplyInfo;
import com.bonus.common.biz.domain.lease.WorkPeopleInfo;
import com.bonus.material.lossAssessment.domain.LossAssignDetails;
import com.bonus.material.lossAssessment.domain.LossAssignInfo;
import com.bonus.material.ma.domain.Type;
import com.bonus.material.settlement.domain.SltAgreementInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 丢失报备
* @author ma_sh
*/
@Mapper
public interface LossAssignMapper {
/**
* 根据协议Id查询在用安全工器具编码
* @param sltAgreementInfo
* @return
*/
List<SltAgreementInfo> getUseData(SltAgreementInfo sltAgreementInfo);
/**
* 批量查询
* @param agreementId
* @param pairs
* @return
*/
List<SltAgreementInfo> getBatchInfo(@Param("agreementId") Long agreementId, @Param("pairs") List<SltAgreementInfo> pairs);
/**
* 生成丢失单号
* @return
*/
Integer getListAll();
/**
* 保存主表
* @param lossAssignInfo
* @return
*/
int saveDirectApplyInfo(LossAssignInfo lossAssignInfo);
/**
* 保存详情表
* @param lossAssignDetails
* @return
*/
int saveDirectApplyDetails(List<LossAssignDetails> lossAssignDetails);
/**
* 根据project_id获取external_id
* @param projectId
* @return
*/
LossAssignInfo getExternalId(int projectId);
/**
* 获取项目经理id
* @param externalId
* @return
*/
String getDeptId(String externalId);
/**
* 获取项目经理账号
* @param leaderId
* @return
*/
String getUserNameById(String leaderId);
/**
* 获取项目经理账号
* @param userName
* @return
*/
List<WorkPeopleInfo> getUserIdByUserName(String userName);
/**
* 插入工单
* @param workApplyInfo
* @return
*/
int insertWorkOrder(WorkApplyInfo workApplyInfo);
/**
* 插入工单
* @param workPeopleInfo
* @return
*/
int insertWorkPeople(WorkPeopleInfo workPeopleInfo);
/**
* 更新主表
* @param lossAssignInfo
* @return
*/
int updateDirectApplyInfo(LossAssignInfo lossAssignInfo);
/**
* 删除详情表
* @param id
* @return
*/
int deleteDirectApplyDetails(Integer id);
/**
* 删除工单
* @param newId
*/
void deleteWorkflowRecord(int newId);
/**
* 删除主表
* @param lossAssignInfo
* @return
*/
int deleteDirectApplyInfo(LossAssignInfo lossAssignInfo);
/**
* 根据id查询
* @param lossAssignInfo
* @return
*/
LossAssignInfo getInfoById(LossAssignInfo lossAssignInfo);
/**
* 查询详情表信息
* @param id
* @return
*/
List<LossAssignDetails> getDetailsById(Integer id);
/**
* 根据项目id查询部门信息
* @param info
* @return
*/
LossAssignInfo getDeptInfo(LossAssignInfo info);
/**
* 根据id查询详情表信息
* @param lossAssignInfo
* @return
*/
LossAssignInfo getInfoDetails(LossAssignInfo lossAssignInfo);
/**
* 查询审批人
* @param lossAssignInfo
* @return
*/
List<WorkPeopleInfo> getUseList(LossAssignInfo lossAssignInfo);
/**
* 修改状态
* @param maId
* @param maStatus
* @return
*/
int updateStatus(@Param("maId") Long maId, @Param("maStatus") int maStatus);
/**
* 查询列表
* @param lossAssignInfo
* @return
*/
List<LossAssignInfo> getList(LossAssignInfo lossAssignInfo);
/**
* 查询类型
* @param agreementId
* @return
*/
List<Type> selectMaTypeThreeLists(Long agreementId);
/**
* 查询数量
* @param detail
* @return
*/
LossAssignDetails getNumList(LossAssignDetails detail);
/**
* 真正删除详情表内容
* @param id
* @return
*/
int deleteApplyDetails(Integer id);
}

View File

@ -0,0 +1,81 @@
package com.bonus.material.lossAssessment.service;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.material.lossAssessment.domain.LossAssignInfo;
import com.bonus.material.lossAssessment.domain.LossAssignVo;
import com.bonus.material.ma.domain.Type;
import com.bonus.material.settlement.domain.SltAgreementInfo;
import java.util.List;
/**
* 丢失报备service
* @author ma_sh
*/
public interface LossAssignService {
/**
* 根据协议Id查询在用数据
* @param sltAgreementInfo
* @return
*/
List<SltAgreementInfo> getUseData(SltAgreementInfo sltAgreementInfo);
/**
* 批量查询待转数量
* @param agreementId
* @param pairs
* @return
*/
List<SltAgreementInfo> getBatchInfo(Long agreementId, List<SltAgreementInfo> pairs);
/**
* 新增申请
* @param lossAssignVo
* @return
*/
AjaxResult add(LossAssignVo lossAssignVo);
/**
* 修改申请
* @param lossAssignVo
* @return
*/
AjaxResult edit(LossAssignVo lossAssignVo);
/**
* 删除申请
* @param lossAssignInfo
* @return
*/
AjaxResult remove(LossAssignInfo lossAssignInfo);
/**
* 查看详情
* @param lossAssignInfo
* @return
*/
AjaxResult getInfoById(LossAssignInfo lossAssignInfo);
/**
* 报备丢失审批
* @param lossAssignInfo
* @return
*/
AjaxResult updateDirectSysWorkflowRecordHistory(LossAssignInfo lossAssignInfo);
/**
* 丢失报备查询列表
* @param lossAssignInfo
* @return
*/
List<LossAssignInfo> getList(LossAssignInfo lossAssignInfo);
/**
* 获取物资类型连动式下拉框
* @param typeId
* @param agreementId
* @return
*/
List<Type> getEquipmentThreeTypes(Long typeId, Long agreementId);
}

View File

@ -0,0 +1,924 @@
package com.bonus.material.lossAssessment.service.impl;
import com.bonus.common.biz.domain.lease.WorkApplyInfo;
import com.bonus.common.biz.domain.lease.WorkPeopleInfo;
import com.bonus.common.core.exception.ServiceException;
import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.core.utils.StringUtils;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.security.utils.SecurityUtils;
import com.bonus.material.clz.domain.BmTeam;
import com.bonus.material.clz.domain.direct.ClzDirectApplyDetails;
import com.bonus.material.clz.domain.direct.WorkflowEvent;
import com.bonus.material.clz.mapper.MaterialMachineMapper;
import com.bonus.material.common.mapper.SelectMapper;
import com.bonus.material.lease.mapper.LeaseTaskMapper;
import com.bonus.material.lossAssessment.domain.LossAssignDetails;
import com.bonus.material.lossAssessment.domain.LossAssignInfo;
import com.bonus.material.lossAssessment.domain.LossAssignVo;
import com.bonus.material.lossAssessment.mapper.LossAssignMapper;
import com.bonus.material.lossAssessment.service.LossAssignService;
import com.bonus.material.ma.domain.DirectApplyUrl;
import com.bonus.material.ma.domain.Type;
import com.bonus.material.settlement.domain.SltAgreementInfo;
import com.bonus.material.work.domain.SysWorkflowNode;
import com.bonus.material.work.domain.SysWorkflowRecord;
import com.bonus.material.work.domain.SysWorkflowRecordHistory;
import com.bonus.material.work.domain.SysWorkflowType;
import com.bonus.material.work.mapper.SysWorkflowNodeMapper;
import com.bonus.material.work.mapper.SysWorkflowRecordHistoryMapper;
import com.bonus.material.work.mapper.SysWorkflowRecordMapper;
import com.bonus.material.work.mapper.SysWorkflowTypeMapper;
import com.bonus.system.api.domain.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.util.UriComponentsBuilder;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import static com.bonus.common.biz.enums.TmTaskTypeEnum.*;
/**
* 丢失报备服务实现类
*/
@Service("LossAssignService")
@Validated
@Slf4j
public class LossAssignServiceImpl implements LossAssignService {
@Resource
private LossAssignMapper mapper;
@Resource
private SysWorkflowTypeMapper sysWorkflowTypeMapper;
@Resource
private SysWorkflowRecordMapper sysWorkflowRecordMapper;
@Resource
private SysWorkflowRecordHistoryMapper sysWorkflowRecordHistoryMapper;
@Resource
private SysWorkflowNodeMapper sysWorkflowNodeMapper;
@Resource
private LeaseTaskMapper lMapper;
@Resource
private MaterialMachineMapper materialMachineMapper;
@Resource
private SelectMapper selectMapper;
/**
* 根据协议Id查询在用安全工器具编码
* @param sltAgreementInfo
* @return
*/
@Override
public List<SltAgreementInfo> getUseData(SltAgreementInfo sltAgreementInfo) {
return mapper.getUseData(sltAgreementInfo);
}
/**
* 批量查询待转数量
* @param agreementId
* @param pairs
* @return
*/
@Override
public List<SltAgreementInfo> getBatchInfo(Long agreementId, List<SltAgreementInfo> pairs) {
return mapper.getBatchInfo(agreementId, pairs);
}
/**
* 新增申请
* @param lossAssignVo
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult add(LossAssignVo lossAssignVo) {
try {
int id;
String code;
if (lossAssignVo != null) {
if (lossAssignVo.getLossAssignInfo() != null) {
LossAssignInfo lossAssignInfo = lossAssignVo.getLossAssignInfo();
// 获取丢失单号
code = genderLossCode();
lossAssignInfo.setCode(code);
lossAssignInfo.setCreateTime(new Date());
List<String> urls = new ArrayList<>();
if (lossAssignVo.getLossAssignInfo().getDirUrls() != null) {
List<DirectApplyUrl> dirUrls = lossAssignVo.getLossAssignInfo().getDirUrls();
for (DirectApplyUrl dirUrl : dirUrls){
urls.add(dirUrl.getUrl());
}
//将urls所有内容用逗号拼接
lossAssignInfo.setLossUrl(String.join(",", urls));
}
lossAssignInfo.setCreateBy(SecurityUtils.getLoginUser().getUserid().toString());
// 待审核
lossAssignInfo.setStatus(0);
//保存主表
int i = mapper.saveDirectApplyInfo(lossAssignInfo);
if (i < 0) {
throw new RuntimeException("保存主表失败");
}
id = lossAssignInfo.getId();
} else {
return AjaxResult.error("参数不能为空");
}
if (!CollectionUtils.isEmpty(lossAssignVo.getLossAssignDetails())) {
lossAssignVo.getLossAssignDetails().forEach(lossAssignDetails -> {
lossAssignDetails.setLossId(id);
lossAssignDetails.setCreateBy(SecurityUtils.getLoginUser().getUserid().toString());
});
int i = mapper.saveDirectApplyDetails(lossAssignVo.getLossAssignDetails());
if (i < 0) {
throw new RuntimeException("保存明细表失败");
}
}
} else {
return AjaxResult.error("保存失败");
}
// 新增审批流
addSysWorkflowRecord(new WorkflowEvent(id, code, TM_TASK_LOSS_REPORT.getTaskTypeId(), lossAssignVo.getLossAssignInfo().getLossProName(), 0, null, lossAssignVo.getLossAssignInfo().getLossUnitId(), lossAssignVo.getLossAssignInfo().getLossProId()));
} catch (RuntimeException e) {
e.printStackTrace();
}
return AjaxResult.success("保存成功");
}
/**
* 修改申请
* @param lossAssignVo
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult edit(LossAssignVo lossAssignVo) {
if (lossAssignVo == null || lossAssignVo.getLossAssignInfo() == null || CollectionUtils.isEmpty(lossAssignVo.getLossAssignDetails())) {
return AjaxResult.error("参数不能为空");
}
// 判断是否有新增可申请数量为0的设备
List<LossAssignDetails> assignDetails = lossAssignVo.getLossAssignDetails();
// 根据id查询当前单子数据剔除当前单子数据
List<LossAssignDetails> details = mapper.getDetailsById(lossAssignVo.getLossAssignInfo().getId());
// 将details中的maId提取出来
Set<Long> maIds = details.stream().map(LossAssignDetails::getMaId).collect(Collectors.toSet());
// 将assignDetails中transNum为0且maId不存在为maIds的maCode全部提取出来
List<String> maCodes = assignDetails.stream().filter(assignDetail -> assignDetail.getTransNum().compareTo(BigDecimal.ZERO) == 0 && !maIds.contains(assignDetail.getMaId())).map(LossAssignDetails::getMaCode).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(maCodes)) {
return AjaxResult.error("设备编码:" + String.join(",", maCodes) + "可申请数量为0请重新选择");
}
try {
LossAssignInfo lossAssignInfo = lossAssignVo.getLossAssignInfo();
lossAssignInfo.setCreateTime(DateUtils.getNowDate());
lossAssignInfo.setCreateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
List<String> urls = new ArrayList<>();
if (!CollectionUtils.isEmpty(lossAssignInfo.getDirUrls())) {
List<DirectApplyUrl> dirUrls = lossAssignInfo.getDirUrls();
for (DirectApplyUrl dirUrl : dirUrls) {
urls.add(dirUrl.getUrl());
}
//将urls所有内容用逗号拼接
lossAssignInfo.setLossUrl(String.join(",", urls));
}
// 修改info表
// 待审核
lossAssignInfo.setStatus(0);
int i = mapper.updateDirectApplyInfo(lossAssignInfo);
if (i < 0) {
throw new RuntimeException("修改主表失败");
}
// 真正删除详情表内容
i = mapper.deleteApplyDetails(lossAssignInfo.getId());
if (i < 0) {
throw new RuntimeException("删除详情表失败");
}
List<LossAssignDetails> lossAssignDetails = lossAssignVo.getLossAssignDetails();
Integer id = lossAssignVo.getLossAssignInfo().getId();
lossAssignDetails.forEach(lossAssignDetail -> {
lossAssignDetail.setLossId(id);
lossAssignDetail.setCreateBy(SecurityUtils.getLoginUser().getUserid().toString());
});
i = mapper.saveDirectApplyDetails(lossAssignDetails);
if (i < 0) {
throw new RuntimeException("保存明细表失败");
}
// 修改审批流
updateSysWorkflowRecord(new WorkflowEvent(lossAssignVo.getLossAssignInfo().getId(), lossAssignVo.getLossAssignInfo().getCode(), TM_TASK_LOSS_REPORT.getTaskTypeId(), lossAssignVo.getLossAssignInfo().getLossProName(), lossAssignVo.getLossAssignInfo().getAgreementId(), null, lossAssignVo.getLossAssignInfo().getLossUnitId(), lossAssignVo.getLossAssignInfo().getLossProId()));
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException("修改失败,请联系管理员");
}
return AjaxResult.success("修改成功");
}
/**
* 删除申请
* @param lossAssignInfo
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult remove(LossAssignInfo lossAssignInfo) {
try {
// 删除主表
int i = mapper.deleteDirectApplyInfo(lossAssignInfo);
if (i < 0) {
throw new RuntimeException("删除主表失败");
}
// 删除详情表
i += mapper.deleteDirectApplyDetails(lossAssignInfo.getId());
if (i < 0) {
throw new RuntimeException("删除详情表失败");
}
} catch (RuntimeException e) {
log.error("删除失败:{}", e.getMessage());
}
return AjaxResult.success("删除成功");
}
/**
* 查看详情
* @param lossAssignInfo
* @return
*/
@Override
public AjaxResult getInfoById(LossAssignInfo lossAssignInfo) {
LossAssignVo lossAssignVo = new LossAssignVo();
// 先查询info表信息
LossAssignInfo info = mapper.getInfoById(lossAssignInfo);
// 根据领退料i8工程id查询分公司及项目部信息
LossAssignInfo leaseApplyInfo = mapper.getDeptInfo(info);
if (leaseApplyInfo != null) {
info.setLossDepartName(leaseApplyInfo.getLossDepartName());
info.setLossImpUnitName(leaseApplyInfo.getLossImpUnitName());
}
if (StringUtils.isNotBlank(info.getLossUrl())) {
//用逗号分割放入数组
String[] split = info.getLossUrl().split(",");
List<DirectApplyUrl> list1 = new ArrayList<>();
for (String s : split) {
list1.add(new DirectApplyUrl(s));
}
info.setDirUrls(list1);
}
lossAssignVo.setLossAssignInfo(info);
// 查询详情表信息
List<LossAssignDetails> details = mapper.getDetailsById(lossAssignInfo.getId());
if (!CollectionUtils.isEmpty(details)) {
// 根据协议id类型id及设备id查询待转及可转数量
for (LossAssignDetails detail : details) {
LossAssignDetails assignDetails = mapper.getNumList(detail);
if (assignDetails != null) {
if (detail.getLossId().equals(assignDetails.getLossId())) {
detail.setWaitTransNum(BigDecimal.ZERO);
detail.setTransNum(BigDecimal.ONE);
} else {
detail.setWaitTransNum(assignDetails.getWaitTransNum());
detail.setTransNum(BigDecimal.ZERO);
}
}
}
}
lossAssignVo.setLossAssignDetails(details);
return AjaxResult.success(lossAssignVo);
}
/**
* 报备丢失审批
* @param lossAssignInfo
* @return
*/
@Override
public AjaxResult updateDirectSysWorkflowRecordHistory(LossAssignInfo lossAssignInfo) {
Integer isAccept = lossAssignInfo.getIsAccept();
String remark = lossAssignInfo.getRemark();
// 考虑工单直转参数只有一个id故从后台查询详细数据
lossAssignInfo = mapper.getInfoDetails(lossAssignInfo);
lossAssignInfo.setIsAccept(isAccept);
lossAssignInfo.setRemark(remark);
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
Long userId = sysUser.getUserId();
Integer taskId = lossAssignInfo.getId();
String recordCode = lossAssignInfo.getCode();
Integer nextNodeId = lossAssignInfo.getNextNodeId();
Integer nodeId = lossAssignInfo.getNodeId();
lossAssignInfo.setCreateBy(userId.toString());
if (lossAssignInfo.getIsAccept() == null) {
throw new ServiceException("请选择是否接受审批");
}
// 查询出当前任务所属审批流的所有节点
List<SysWorkflowNode> sysWorkflowNodeList = getWorkflowNodes(lossAssignInfo);
if (lossAssignInfo.getIsAccept() == 1) {
// 处理审批通过
handleDirectApproval(sysWorkflowNodeList, lossAssignInfo, sysUser, taskId, recordCode, nextNodeId, nodeId);
} else {
// 处理审核驳回
handleDirectReject(sysWorkflowNodeList, lossAssignInfo, taskId);
}
return AjaxResult.success("操作成功");
}
/**
* 丢失报备查询列表
* @param lossAssignInfo
* @return
*/
@Override
public List<LossAssignInfo> getList(LossAssignInfo lossAssignInfo) {
Set<String> userRoles = SecurityUtils.getLoginUser().getRoles();
String username = SecurityUtils.getLoginUser().getUsername();
BmTeam teamData = null;
// 检查用户是否具有特殊角色
boolean hasSpecialRole = hasSpecialRole(userRoles);
if (!hasSpecialRole) {
// 根据用户名判断用户是否为班组长
teamData = materialMachineMapper.getTeamData(username);
if (teamData == null) {
// 根据用户名查询项目部信息
List<String> departId = selectMapper.getDepartId(username);
// 根据项目部id查询工程信息
List<String> projectIdList = selectMapper.getProjectId(departId);
if (!org.springframework.util.CollectionUtils.isEmpty(projectIdList)) {
lossAssignInfo.setProjectIdList(projectIdList);
}
// 部门查询赋值
extractedDept(lossAssignInfo);
}
}
List<LossAssignInfo> list = mapper.getList(lossAssignInfo);
if (!com.alibaba.nacos.common.utils.CollectionUtils.isEmpty(list) && teamData != null) {
list = list.stream()
.filter(item ->
(StringUtils.isNotBlank(item.getBzIdCard()) && Objects.equals(username, item.getBzIdCard()))
)
.collect(Collectors.toList());
}
return list;
}
/**
* 获取物资类型连动式下拉框
* @param typeId
* @param agreementId
* @return
*/
@Override
public List<Type> getEquipmentThreeTypes(Long typeId, Long agreementId) {
List<Type> maTypes = mapper.selectMaTypeThreeLists(agreementId);
List<Type> list = new ArrayList<>();
for (Type maType : maTypes) {
if (maType.getParentId() == 0) {
list.add(maType);
}
}
//根据父节点获取对应的儿子节点
for (Type maType : list) {
List<Type> child = getChild(maTypes, maType.getTypeId());
maType.setChildren(child);
}
return list;
}
/**
* 递归调用获取子级
*
* @param list 集合
* @param parentId 父级id
*/
public List<Type> getChild(List<Type> list, Long parentId) {
List<Type> childList = new ArrayList<Type>();
for (Type maType : list) {
Long typeId = maType.getTypeId();
Long pid = maType.getParentId();
if (parentId.equals(pid)) {
List<Type> childLists = getChild(list, typeId);
maType.setChildren(childLists);
childList.add(maType);
}
}
return childList;
}
/**
* 部门查询赋值
* @param lossAssignInfo
*/
private void extractedDept(LossAssignInfo lossAssignInfo) {
String deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId().toString();
Set<String> targetUnits = new HashSet<>(Arrays.asList(
"101", "102", "309", "327", "330", "333", "337", "338",
"339", "340", "341", "342", "344", "345", "346", "347",
"348", "349"
));
if (targetUnits.contains(deptId)) {
lossAssignInfo.setImpUnit(deptId);
} else {
//判断祖籍是否包含分公司
String ancestors = selectMapper.getAncestors(deptId);
if (ancestors != null && !ancestors.isEmpty()) {
// 将ancestors转换为集合
String[] parts = ancestors.split(",");
for (String part : parts) {
String trimmedPart = part.trim();
// Check if the trimmed part is in our target set
if (targetUnits.contains(trimmedPart)) {
lossAssignInfo.setImpUnit(trimmedPart);
break;
}
}
}
}
}
/**
* 检查用户是否具有特殊角色
* @param userRoles
* @return
*/
private boolean hasSpecialRole(Set<String> userRoles) {
if (userRoles == null) {
return false;
}
List<String> allowedRoles = Collections.singletonList("clzcx");
return allowedRoles.stream().anyMatch(userRoles::contains);
}
/**
* 处理审核驳回
* @param sysWorkflowNodeList
* @param lossAssignInfo
* @param taskId
*/
private void handleDirectReject(List<SysWorkflowNode> sysWorkflowNodeList, LossAssignInfo lossAssignInfo, Integer taskId) {
updateWorkflowStatus(taskId, 3);
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
// 修改工单信息
updateWorkOrder(lossAssignInfo.getRecordId(), sysUser.getUserName());
for (int i = 0; i < sysWorkflowNodeList.size(); i++) {
// 判断列表中哪个节点是当前审批的节点如果不是审批的节点不处理
if (lossAssignInfo.getNextNodeId().equals(sysWorkflowNodeList.get(i).getId())) {
log.info("-------------进入到了当前审批的节点-------------");
//插入history表中
SysWorkflowRecordHistory history = new SysWorkflowRecordHistory();
history.setNodeId(lossAssignInfo.getNextNodeId());
if (sysWorkflowNodeList.size() - 1 != i) {
history.setNextNodeId(sysWorkflowNodeList.get(i + 1).getId());
sysWorkflowNodeList.get(i).setNextNodeId(sysWorkflowNodeList.get(i + 1).getId());
sysWorkflowNodeList.get(i).setNextRoleIds(sysWorkflowNodeList.get(i + 1).getRoleIds());
} else {
history.setNextNodeId(null);
sysWorkflowNodeList.get(i).setNextNodeId(null);
sysWorkflowNodeList.get(i).setNextRoleIds(null);
}
history.setRemark(lossAssignInfo.getRemark());
history.setRecordId(lossAssignInfo.getRecordId());
history.setIsAccept(lossAssignInfo.getIsAccept());
history.setCreateBy(sysUser.getUserId().toString());
sysWorkflowRecordHistoryMapper.addSysWorkflowRecordHistory(history);
}
}
}
/**
* 修改工单信息
* @param recordId
* @param userName
*/
private void updateWorkOrder(Integer recordId, String userName) {
WorkPeopleInfo peopleInfo = new WorkPeopleInfo();
peopleInfo.setFlowId(recordId);
peopleInfo.setReceiverUsername(userName);
List<WorkPeopleInfo> infos = lMapper.getWorkPeopleInfo(peopleInfo);
if (com.alibaba.nacos.common.utils.CollectionUtils.isNotEmpty(infos)) {
for (WorkPeopleInfo info : infos) {
peopleInfo.setInformationId(info.getInformationId());
lMapper.updateWorkPeopleInfo(peopleInfo);
}
}
}
/**
* 修改任务状态
*
* @param taskId
* @param status
*/
private void updateWorkflowStatus(Integer taskId, int status) {
SysWorkflowRecord sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setTaskId(taskId);
sysWorkflowRecord.setWorkflowStatus(status);
sysWorkflowRecord.setTaskType(26);
sysWorkflowRecordMapper.updateSysWorkflowRecord(sysWorkflowRecord);
// 修改bm_loss_assign表状态为驳回
LossAssignInfo lossAssignInfo = new LossAssignInfo();
lossAssignInfo.setId(taskId);
lossAssignInfo.setStatus(status);
mapper.updateDirectApplyInfo(lossAssignInfo);
}
/**
* 处理审批通过
* @param sysWorkflowNodeList
* @param lossAssignInfo
* @param sysUser
* @param taskId
* @param recordCode
* @param nextNodeId
* @param nodeId
*/
private void handleDirectApproval(List<SysWorkflowNode> sysWorkflowNodeList, LossAssignInfo lossAssignInfo, SysUser sysUser, Integer taskId, String recordCode, Integer nextNodeId, Integer nodeId) {
boolean found = false;
List<WorkPeopleInfo> userList = new ArrayList<>();
for (int i = 0; i < sysWorkflowNodeList.size(); i++) {
// 判断列表中哪个节点是当前审批的节点如果不是审批的节点不处理
if (lossAssignInfo.getNextNodeId().equals(sysWorkflowNodeList.get(i).getId())) {
log.info("-------------进入到了当前审批的节点-------------");
//插入history表中
SysWorkflowRecordHistory history = new SysWorkflowRecordHistory();
history.setNodeId(lossAssignInfo.getNextNodeId());
SysWorkflowRecordHistory sysWorkflowRecordHistory = new SysWorkflowRecordHistory();
sysWorkflowRecordHistory.setRecordId(lossAssignInfo.getRecordId());
sysWorkflowRecordHistory.setNodeId(nextNodeId);
if (sysWorkflowNodeList.size() - 1 != i) {
history.setNextNodeId(sysWorkflowNodeList.get(i + 1).getId());
sysWorkflowNodeList.get(i).setNextNodeId(sysWorkflowNodeList.get(i + 1).getId());
sysWorkflowNodeList.get(i).setNextRoleIds(sysWorkflowNodeList.get(i + 1).getRoleIds());
} else {
history.setNextNodeId(null);
nextNodeId = null;
sysWorkflowNodeList.get(i).setNextNodeId(null);
sysWorkflowNodeList.get(i).setNextRoleIds(null);
}
//目前定义为安全工器具为刘春杰审批
if (history.getNextNodeId() != null && history.getNextNodeId() == 47) {
lossAssignInfo.setUserId(1549L);
userList = mapper.getUseList(lossAssignInfo);
}
String userIds = userList.stream().map(WorkPeopleInfo::getUserId).map(String::valueOf).collect(Collectors.joining(","));
history.setDirectUserIds(userIds);
history.setRemark(lossAssignInfo.getRemark());
history.setRecordId(lossAssignInfo.getRecordId());
history.setIsAccept(lossAssignInfo.getIsAccept());
history.setCreateBy(sysUser.getUserId().toString());
sysWorkflowRecordHistoryMapper.addSysWorkflowRecordHistory(history);
//获取当前node的directUserIds
String userIdsNow = sysWorkflowRecordHistoryMapper.getNowUserIds(sysWorkflowRecordHistory);
// 判断当前用户是否是当前节点的配置用户
if (StringUtils.isNotBlank(userIdsNow)) {
if (userIdsNow.contains(sysUser.getUserId().toString())) {
log.info("-------------✅通过校验,当前用户是该节点审批人员,进行更新任务信息-------------");
// 根据任务ID 更新审批流状态
updateWorkflowStatus(taskId, 1);
found = true;
break;
} else {
throw new ServiceException("您不是当前节点配置的审批人员,无法进行操作!!");
}
} else {
throw new ServiceException("您不是当前节点配置的审批人员,无法进行操作!!");
}
}
}
if (!found) {
return;
}
try {
log.info("-------------节点更新工单信息✔-------------");
// 修改工单信息
updateWorkOrder(lossAssignInfo.getRecordId(), sysUser.getUserName());
// 如果下个节点存在的话那么就创建下个节点的工单信息
if (nextNodeId != null && com.alibaba.nacos.common.utils.CollectionUtils.isNotEmpty(userList)) {
createWorkOrderAndPeopleDirect(sysUser, lossAssignInfo.getLossProName(), taskId, recordCode, lossAssignInfo.getRecordId(), nextNodeId, userList);
} else {
int result = 0;
//处理设备状态为丢失状态
List<LossAssignDetails> detailsById = mapper.getDetailsById(lossAssignInfo.getId());
for (LossAssignDetails details : detailsById) {
result = mapper.updateStatus(details.getMaId(), 18);
if (result == 0) {
throw new ServiceException("更新设备状态失败");
}
}
// 更新任务状态为已完成
updateWorkflowStatus(lossAssignInfo.getId(), 2);
}
log.info("-------------节点更新工单信息结束-------------");
} catch (Exception e) {
System.err.println("更新工单信息失败:" + e.getMessage());
log.error("更新工单信息失败: {}", e.getMessage(), e);
}
}
/**
* 处理审批通过
* @param sysUser
* @param backProName
* @param taskId
* @param taskCode
* @param newId
* @param nodeId
* @param userList
*/
private void createWorkOrderAndPeopleDirect(SysUser sysUser, String backProName, int taskId, String taskCode, int newId,int nodeId,List<WorkPeopleInfo> userList) {
String id = UUID.randomUUID().toString().replace("-", "");
String webUrlBase = "/mea-h5/#/pages/businessAudit/siteDirectAudit/details";
String queryParams = UriComponentsBuilder.newInstance()
.queryParam("appId", "9fa73f046ef520b09e94bbffc3b07702")
.queryParam("taskId", taskId)
.queryParam("id", newId)
.queryParam("nodeId", nodeId)
.build().encode().toUriString();
WorkApplyInfo workApplyInfo = new WorkApplyInfo();
workApplyInfo.setId(id);
workApplyInfo.setTitle("智能机具-直转申请待审核");
workApplyInfo.setCreateUserName(sysUser.getUserName());
workApplyInfo.setContent(sysUser.getNickName() + ":" + taskCode + "-" + backProName);
workApplyInfo.setType(1);
workApplyInfo.setWebAppId("9fa73f046ef520b09e94bbffc3b07702");
workApplyInfo.setSendUserName(sysUser.getUserName());
workApplyInfo.setTypeId(2025050901);
workApplyInfo.setBusinessId(String.valueOf(newId));
workApplyInfo.setNextStatus("待审核");
workApplyInfo.setFlowState(null);
workApplyInfo.setWebUrl(webUrlBase + queryParams);
workApplyInfo.setRout(webUrlBase + queryParams);
int countWork = mapper.insertWorkOrder(workApplyInfo);
if (countWork > 0) {
for (WorkPeopleInfo user : userList) {
WorkPeopleInfo workPeopleInfo = new WorkPeopleInfo();
workPeopleInfo.setId(UUID.randomUUID().toString().replace("-", ""));
workPeopleInfo.setInformationId(id);
workPeopleInfo.setReceiverUsername(user.getUserName());
workPeopleInfo.setReadState(0);
workPeopleInfo.setHandleState(0);
workPeopleInfo.setIsExamine(0);
mapper.insertWorkPeople(workPeopleInfo);
}
}
}
/**
* 审批所有节点
* @param lossAssignInfo
* @return
*/
private List<SysWorkflowNode> getWorkflowNodes(LossAssignInfo lossAssignInfo) {
SysWorkflowNode sysWorkflowNode = new SysWorkflowNode();
sysWorkflowNode.setTypeId(23);
List<SysWorkflowNode> sysWorkflowNodeList = sysWorkflowNodeMapper.selectSysWorkflowNodeList(sysWorkflowNode);
if (sysWorkflowNodeList == null || sysWorkflowNodeList.isEmpty()) {
throw new ServiceException("流程节点配置为空");
}
return sysWorkflowNodeList;
}
/**
* 修改审批流
* @param event
*/
private void updateSysWorkflowRecord(WorkflowEvent event) {
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
SysWorkflowRecord recordInfo = new SysWorkflowRecord();
int count = 0;
//获取审批流id
SysWorkflowType sysWorkflowType = new SysWorkflowType();
sysWorkflowType.setTaskType(event.getTaskType());
sysWorkflowType.setIsEnable(1);
List<SysWorkflowType> sysWorkflowTypeList = sysWorkflowTypeMapper.selectSysWorkflowTypeList(sysWorkflowType);
if (sysWorkflowTypeList.isEmpty()) {
throw new ServiceException("新增任务审批记录失败,请创建审核流程");
}
SysWorkflowRecord sysWorkflowRecord = new SysWorkflowRecord();
if (sysWorkflowTypeList.size() == 1) {
// 如果该任务类型配置了一个审批流则直接使用
sysWorkflowType = sysWorkflowTypeList.get(0);
// 先根据id查询该数据是否已经存在
recordInfo = sysWorkflowRecordMapper.getWorkflowRecordHistory(event);
// 根据id删除该数据
if (recordInfo != null) {
sysWorkflowRecordMapper.deleteSysWorkflowRecord(event);
}
sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setWorkflowId(sysWorkflowType.getId());
sysWorkflowRecord.setTaskId(event.getTaskId());
sysWorkflowRecord.setTaskType(event.getTaskType());
sysWorkflowRecord.setTaskCode(event.getTaskCode());
//创建审批任务
count = sysWorkflowRecordMapper.addSysWorkflowRecord(sysWorkflowRecord);
if (0 == count) {
throw new RuntimeException("创建审批任务失败!");
}
}
// 获取新创建的ID
int newId = sysWorkflowRecord.getId();
//获取当前审核流下的节点
SysWorkflowNode sysWorkflowNode = new SysWorkflowNode();
sysWorkflowNode.setTypeId(sysWorkflowType.getId());
List<SysWorkflowNode> sysWorkflowNodeList = sysWorkflowNodeMapper.selectSysWorkflowNodeList(sysWorkflowNode);
// 创建审核记录
SysWorkflowRecordHistory sysWorkflowRecordHistory = new SysWorkflowRecordHistory();
sysWorkflowRecordHistory.setRecordId(sysWorkflowRecord.getId());
sysWorkflowRecordHistory.setNodeId(sysWorkflowNodeList.get(0).getId());
sysWorkflowRecordHistory.setNextNodeId(sysWorkflowNodeList.get(1).getId());
sysWorkflowRecordHistory.setIsAccept(1);
sysWorkflowRecordHistory.setCreateBy(SecurityUtils.getLoginUser().getUserid().toString());
sysWorkflowRecordHistory.setCreateTime(DateUtils.getNowDate());
//根据project_id获取external_id
List<WorkPeopleInfo> userList = new ArrayList<>();
LossAssignInfo lossAssignInfo = mapper.getExternalId(Integer.parseInt(event.getLeaseProId()));
if (lossAssignInfo != null) {
//获取项目经理id
String leaderId = mapper.getDeptId(lossAssignInfo.getLossExternalId());
//获取项目经理账号
String leaderAccount = mapper.getUserNameById(leaderId);
if (leaderAccount != null && !leaderAccount.isEmpty()) {
userList = mapper.getUserIdByUserName(leaderAccount);
}
if (com.alibaba.nacos.common.utils.CollectionUtils.isNotEmpty(userList)) {
String userIds = userList.stream().map(WorkPeopleInfo::getUserId).map(String::valueOf).collect(Collectors.joining(","));
sysWorkflowRecordHistory.setDirectUserIds(userIds);
} else {
mapper.deleteWorkflowRecord(newId);
log.info("项目经理账号不存在");
}
}
// 先根据id查询该数据是否已经存在
if (recordInfo != null) {
SysWorkflowRecordHistory info = sysWorkflowRecordHistoryMapper.getHistoryInfo(recordInfo.getId());
if (info != null) {
// 将审核记录删除重新添加
sysWorkflowRecordHistoryMapper.deleteSysWorkflowRecordHistory(recordInfo.getId());
}
}
sysWorkflowRecordHistoryMapper.addSysWorkflowRecordHistory(sysWorkflowRecordHistory);
if (count > 0 && com.alibaba.nacos.common.utils.CollectionUtils.isNotEmpty(userList)) {
// 先根据newId查询sys_information表信息
WorkApplyInfo workApplyInfo = sysWorkflowRecordHistoryMapper.getSysInformation(newId);
//先根据newId把sys_information和sys_information_people表数据清除
sysWorkflowRecordHistoryMapper.deleteSysInformation(newId);
// 根据workApplyInfo数据删除sys_information_people表数据
if (workApplyInfo != null) {
sysWorkflowRecordHistoryMapper.deleteInformationPeople(workApplyInfo.getId());
}
assert lossAssignInfo != null;
createWorkOrderAndPeople(sysUser, event, Long.valueOf(sysWorkflowRecord.getTaskId()), newId, sysWorkflowRecordHistory.getNodeId(), userList, lossAssignInfo.getLossProName());
}
}
/**
* 新增审批流
* @param event
*/
private void addSysWorkflowRecord(WorkflowEvent event) {
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
int count = 0;
//获取审批流id
SysWorkflowType sysWorkflowType = new SysWorkflowType();
sysWorkflowType.setTaskType(event.getTaskType());
sysWorkflowType.setIsEnable(1);
List<SysWorkflowType> sysWorkflowTypeList = sysWorkflowTypeMapper.selectSysWorkflowTypeList(sysWorkflowType);
if (sysWorkflowTypeList.isEmpty()) {
throw new ServiceException("新增任务审批记录失败,请创建审核流程");
}
SysWorkflowRecord sysWorkflowRecord = new SysWorkflowRecord();
if (sysWorkflowTypeList.size() == 1) {
// 如果该任务类型配置了一个审批流则直接使用
sysWorkflowType = sysWorkflowTypeList.get(0);
sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setWorkflowId(sysWorkflowType.getId());
sysWorkflowRecord.setTaskId(event.getTaskId());
sysWorkflowRecord.setTaskType(event.getTaskType());
sysWorkflowRecord.setTaskCode(event.getTaskCode());
//创建审批任务
count = sysWorkflowRecordMapper.addSysWorkflowRecord(sysWorkflowRecord);
if (0 == count) {
throw new RuntimeException("创建审批任务失败!");
}
}
// 获取新创建的ID
int newId = sysWorkflowRecord.getId();
//获取当前审核流下的节点
SysWorkflowNode sysWorkflowNode = new SysWorkflowNode();
sysWorkflowNode.setTypeId(sysWorkflowType.getId());
List<SysWorkflowNode> sysWorkflowNodeList = sysWorkflowNodeMapper.selectSysWorkflowNodeList(sysWorkflowNode);
// 创建审核记录
SysWorkflowRecordHistory sysWorkflowRecordHistory = new SysWorkflowRecordHistory();
sysWorkflowRecordHistory.setRecordId(sysWorkflowRecord.getId());
sysWorkflowRecordHistory.setNodeId(sysWorkflowNodeList.get(0).getId());
sysWorkflowRecordHistory.setNextNodeId(sysWorkflowNodeList.get(1).getId());
sysWorkflowRecordHistory.setIsAccept(1);
sysWorkflowRecordHistory.setCreateBy(SecurityUtils.getLoginUser().getUserid().toString());
sysWorkflowRecordHistory.setCreateTime(DateUtils.getNowDate());
//根据project_id获取external_id
List<WorkPeopleInfo> userList = new ArrayList<>();
LossAssignInfo lossAssignInfo = mapper.getExternalId(Integer.parseInt(event.getLeaseProId()));
if (lossAssignInfo != null) {
//获取项目经理id
String leaderId = mapper.getDeptId(lossAssignInfo.getLossExternalId());
//获取项目经理账号
String leaderAccount = mapper.getUserNameById(leaderId);
if (leaderAccount != null && !leaderAccount.isEmpty()) {
userList = mapper.getUserIdByUserName(leaderAccount);
}
if (!CollectionUtils.isEmpty(userList)) {
String userIds = userList.stream().map(WorkPeopleInfo::getUserId).map(String::valueOf).collect(Collectors.joining(","));
sysWorkflowRecordHistory.setDirectUserIds(userIds);
}
}
sysWorkflowRecordHistoryMapper.addSysWorkflowRecordHistory(sysWorkflowRecordHistory);
if (count > 0 && !CollectionUtils.isEmpty(userList)) {
assert lossAssignInfo != null;
createWorkOrderAndPeople(sysUser, event, Long.valueOf(sysWorkflowRecord.getTaskId()), newId, sysWorkflowRecordHistory.getNodeId(), userList, lossAssignInfo.getLossProName());
}
}
/**
* 创建工单和工单人员
* @param sysUser
* @param event
* @param taskId
* @param newId
* @param nodeId
* @param userList
* @param projectName
*/
private void createWorkOrderAndPeople(SysUser sysUser, WorkflowEvent event, Long taskId, int newId, int nodeId, List<WorkPeopleInfo> userList, String projectName) {
String id = UUID.randomUUID().toString().replace("-", "");
String webUrlBase = "/mea-h5/#/pages/businessAudit/siteDirectAudit/details";
String queryParams = UriComponentsBuilder.newInstance()
.queryParam("appId", "9fa73f046ef520b09e94bbffc3b07702")
.queryParam("taskId", taskId)
.queryParam("id", newId)
.queryParam("nodeId", nodeId)
.build().encode().toUriString();
WorkApplyInfo workApplyInfo = new WorkApplyInfo();
workApplyInfo.setId(id);
workApplyInfo.setTitle("智能机具-报备丢失待审核");
workApplyInfo.setCreateUserName(sysUser.getUserName());
workApplyInfo.setContent(sysUser.getNickName() + ":" + event.getTaskCode() + "-" + projectName);
workApplyInfo.setType(1);
workApplyInfo.setWebAppId("9fa73f046ef520b09e94bbffc3b07702");
workApplyInfo.setSendUserName(sysUser.getUserName());
workApplyInfo.setTypeId(2025050901);
workApplyInfo.setBusinessId(String.valueOf(newId));
workApplyInfo.setNextStatus("待审核");
workApplyInfo.setFlowState(null);
workApplyInfo.setWebUrl(webUrlBase + queryParams);
workApplyInfo.setRout(webUrlBase + queryParams);
int countWork = mapper.insertWorkOrder(workApplyInfo);
if (countWork > 0) {
for (WorkPeopleInfo user : userList) {
WorkPeopleInfo workPeopleInfo = new WorkPeopleInfo();
workPeopleInfo.setId(UUID.randomUUID().toString().replace("-", ""));
workPeopleInfo.setInformationId(id);
workPeopleInfo.setReceiverUsername(user.getUserName());
workPeopleInfo.setReadState(0);
workPeopleInfo.setHandleState(0);
workPeopleInfo.setIsExamine(0);
mapper.insertWorkPeople(workPeopleInfo);
}
}
}
/**
* 生成丢失单号
* @return
*/
private String genderLossCode() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
Date date = new Date();
String format = simpleDateFormat.format(date);
Integer total = mapper.getListAll();
return "DS" + format + "-" + (total + 1);
}
}

View File

@ -1,6 +1,7 @@
package com.bonus.material.work.mapper;
import com.bonus.common.biz.domain.lease.LeaseApplyInfo;
import com.bonus.material.clz.domain.direct.WorkflowEvent;
import com.bonus.material.work.domain.SysWorkflowRecord;
import com.bonus.material.work.domain.SysWorkflowRecordHistory;
import com.bonus.material.work.domain.dto.SysWorkflowAuditDto;
@ -45,16 +46,16 @@ public interface SysWorkflowRecordMapper {
/**
* 根据id查询审批流记录信息
* @param id
* @param event
* @return
*/
SysWorkflowRecord getWorkflowRecordHistory(Integer id);
SysWorkflowRecord getWorkflowRecordHistory(WorkflowEvent event);
/**
* 删除审批流记录信息
* @param taskId
* @param event
*/
void deleteSysWorkflowRecord(int taskId);
void deleteSysWorkflowRecord(WorkflowEvent event);
int deleteRecord(int id);
}

View File

@ -291,7 +291,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN ma_type mt2 on mt2.type_id = mt1.parent_id
LEFT JOIN ma_machine mm on mm.ma_id = dad.ma_id
LEFT JOIN clz_direct_apply_info cda ON dad.direct_id = cda.id
LEFT JOIN clz_slt_agreement_info csi ON cda.lease_agreement_id
LEFT JOIN clz_slt_agreement_info csi ON cda.lease_agreement_id = csi.agreement_id
LEFT JOIN clz_lease_apply_info cla ON csi.lease_id = cla.id
WHERE dad.direct_id = #{id}
GROUP BY

View File

@ -0,0 +1,626 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bonus.material.lossAssessment.mapper.LossAssignMapper">
<resultMap type="com.bonus.material.ma.domain.Type" id="TypeResult">
<result property="typeId" column="type_id" />
<result property="typeName" column="type_name" />
<result property="parentId" column="parent_id" />
<result property="keeperNickName" column="keeper_nick_name" />
<result property="repairNickName" column="repair_nick_name" />
<result property="houseId" column="house_id" />
<result property="houseName" column="house_name" />
<result property="storageNum" column="storage_num" />
<result property="typeCode" column="type_code" />
<result property="modelCode" column="model_code" />
<result property="unitId" column="unit_id" />
<result property="unitName" column="unit_name" />
<result property="unitValue" column="unit_value" />
<result property="sortNum" column="sort_num" />
<result property="manageType" column="manage_type" />
<result property="leasePrice" column="lease_price" />
<result property="effTime" column="eff_time" />
<result property="rentPrice" column="rent_price" />
<result property="buyPrice" column="buy_price" />
<result property="payRatio" column="pay_ratio" />
<result property="payPrice" column="pay_price" />
<result property="taxRatio" column="tax_ratio" />
<result property="level" column="level" />
<result property="ratedLoad" column="rated_load" />
<result property="testLoad" column="test_load" />
<result property="holdingTime" column="holding_time" />
<result property="warnNum" column="warn_num" />
<result property="delFlag" column="del_flag" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="isPlan" column="is_plan" />
<result property="isAncuo" column="is_ancuo" />
<result property="remark" column="remark" />
<result property="facModel" column="fac_model" />
<result property="intelligentCode" column="intelligent_code" />
<result property="isTest" column="is_test" />
<result property="companyId" column="company_id" />
<result property="samplingRatio" column="sampling_ratio" />
<result property="isEnter" column="is_enter" />
<result property="keeperUserId" column="keep_user_id" />
<result property="isCheck" column="is_check" />
<result property="jiJuType" column="jiju_type" />
</resultMap>
<insert id="saveDirectApplyInfo" keyProperty="id" useGeneratedKeys="true">
insert into bm_loss_assign
(
<if test="code != null and code != ''">
code,
</if>
<if test="agreementId != null ">
agreement_id,
</if>
<if test="lossMan != null and lossMan != ''">
loss_man,
</if>
<if test="lossPhone != null and lossPhone != ''">
phone,
</if>
<if test="lossUrl != null and lossUrl != ''">
loss_url,
</if>
<if test="status != null">
status,
</if>
<if test="createBy != null">
create_by,
</if>
create_time,
del_flag
) values (
<if test="code != null and code != ''">
#{code},
</if>
<if test="agreementId != null">
#{agreementId},
</if>
<if test="lossMan != null and lossMan != ''">
#{lossMan},
</if>
<if test="lossPhone != null and lossPhone != ''">
#{lossPhone},
</if>
<if test="lossUrl != null and lossUrl != ''">
#{lossUrl},
</if>
<if test="status != null">
#{status},
</if>
<if test="createBy != null">
#{createBy},
</if>
NOW(),
'1'
)
</insert>
<insert id="saveDirectApplyDetails">
insert into bm_loss_assign_details(loss_assign_id, type_id, ma_id, num, create_by,create_time, del_flag)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.lossId}, #{item.typeId}, #{item.maId}, #{item.lossNum}, #{item.createBy}, NOW() , '1')
</foreach>
</insert>
<insert id="insertWorkOrder" useGeneratedKeys="true" keyProperty="id">
insert into uni_org.sys_information
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="createTime != null">create_time,</if>
<if test="createUserName != null">create_user_name,</if>
<if test="title != null">title,</if>
<if test="content != null">content,</if>
<if test="webAppId != null">web_app_id,</if>
<if test="type != null">type,</if>
<if test="extend != null">extend,</if>
<if test="sendUserName != null">send_user_name,</if>
<if test="webUrl != null">web_url,</if>
<if test="typeId != null">type_id,</if>
<if test="businessId != null">business_id,</if>
<if test="flowState != null">flow_state,</if>
<if test="rout != null">rout,</if>
<if test="nextStatus != null">next_status,</if>
<if test="extendName != null">extend_name,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="createTime != null">now(),</if>
<if test="createUserName != null">#{createUserName},</if>
<if test="title != null">#{title},</if>
<if test="content != null">#{content},</if>
<if test="webAppId != null">#{webAppId},</if>
<if test="type != null">#{type},</if>
<if test="extend != null">#{extend},</if>
<if test="sendUserName != null">#{sendUserName},</if>
<if test="webUrl != null">#{webUrl},</if>
<if test="typeId != null">#{typeId},</if>
<if test="businessId != null">#{businessId},</if>
<if test="flowState != null">#{flowState},</if>
<if test="rout != null">#{rout},</if>
<if test="nextStatus != null">#{nextStatus},</if>
<if test="extendName != null">#{extendName},</if>
</trim>
</insert>
<insert id="insertWorkPeople">
insert into uni_org.sys_information_people
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="createTime != null">create_time,</if>
<if test="updateTime != null">update_time,</if>
<if test="informationId != null">information_id,</if>
<if test="readState != null">read_state,</if>
<if test="handleState != null">handle_state,</if>
<if test="receiverUsername != null">receiver_username,</if>
<if test="updateUser != null">update_user,</if>
<if test="isExamine != null">is_examine,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="createTime != null">now(),</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="informationId != null">#{informationId},</if>
<if test="readState != null">#{readState},</if>
<if test="handleState != null">#{handleState},</if>
<if test="receiverUsername != null">#{receiverUsername},</if>
<if test="updateUser != null">#{updateUser},</if>
<if test="isExamine != null">#{isExamine},</if>
</trim>
</insert>
<update id="updateDirectApplyInfo">
update bm_loss_assign
set
<if test="agreementId != null">
agreement_id = #{agreementId},
</if>
<if test="lossMan != null">
loss_man = #{lossMan},
</if>
<if test="lossPhone != null">
phone = #{lossPhone},
</if>
<if test="lossUrl != null">
loss_url = #{lossUrl},
</if>
<if test="status != null">
status = #{status},
</if>
update_time= NOW()
where id = #{id}
</update>
<update id="updateStatus">
update ma_machine
set
ma_status = #{maStatus}
where ma_id = #{maId}
</update>
<delete id="deleteDirectApplyDetails">
update bm_loss_assign_details
set del_flag = '0'
where loss_assign_id = #{id}
</delete>
<delete id="deleteWorkflowRecord">
delete from sys_workflow_record where id = #{newId}
</delete>
<delete id="deleteDirectApplyInfo">
update bm_loss_assign
set del_flag = '0'
where id = #{id}
</delete>
<delete id="deleteApplyDetails">
delete from bm_loss_assign_details where loss_assign_id = #{id}
</delete>
<select id="getUseData" resultType="com.bonus.material.settlement.domain.SltAgreementInfo">
SELECT
mt2.type_name AS typeName,
mt.type_name AS typeModelName,
mt.unit_name AS unitName,
sum( sai.num ) AS useNum ,
mm.ma_code AS maCode,
lai.lease_person AS leasePerson,
DATE(sai.start_time) AS startTime,
mm.next_check_time AS nextCheckTime,
sai.ma_id AS maId,
sai.type_id AS typeId,
sai.agreement_id AS agreementId,
lai.create_time AS createTime,
mt.unit_value AS unitValue,
mt.jiju_type AS jiJuType
FROM
slt_agreement_info sai
LEFT JOIN ma_type mt ON sai.type_id = mt.type_id
LEFT JOIN ma_type mt2 ON mt2.type_id = mt.parent_id
LEFT JOIN ma_machine mm ON sai.ma_id = mm.ma_id
LEFT JOIN lease_apply_info lai ON lai.id = sai.lease_id
WHERE
sai.agreement_id = #{agreementId} AND sai.status = '0'
AND mt.jiju_type = '2' AND sai.ma_id is not null
AND mm.ma_status = '2'
<if test="typeId != null">
AND sai.type_id = #{typeId}
</if>
<if test="maId != null">
AND mt.parent_id = #{maId}
</if>
<if test="startDate != null and endDate != ''">
AND DATE_FORMAT(lai.create_time, '%Y-%m-%d' ) BETWEEN #{startDate} AND #{endDate}
</if>
<if test="keyWord != null and keyWord != ''">
AND (mt2.type_name like concat('%', #{keyWord}, '%') or
mt.type_name like concat('%', #{keyWord}, '%') or
mm.ma_code like concat('%', #{keyWord}, '%')
)
</if>
GROUP BY
sai.type_id,
sai.ma_id
</select>
<select id="getBatchInfo" resultType="com.bonus.material.settlement.domain.SltAgreementInfo">
SELECT
bl.agreement_id AS agreementId,
blad.type_id AS typeId,
blad.ma_id AS maId,
bl.id AS id,
SUM(IFNULL(blad.num, 0)) AS waitTransNum -- 待转数量
FROM
bm_loss_assign bl
INNER JOIN bm_loss_assign_details blad ON bl.id = blad.loss_assign_id
WHERE
bl.`status` IN (0, 1)
and bl.del_flag = '1'
and blad.del_flag = '1'
AND bl.agreement_id = #{agreementId}
AND (
<foreach collection="pairs" item="pair" separator="OR">
(blad.type_id = #{pair.typeId}
<if test="pair.maId != null">AND blad.ma_id = #{pair.maId}</if>
<if test="pair.maId == null">AND blad.ma_id IS NULL</if>)
</foreach>
)
AND IFNULL(blad.num, 0) > 0 -- 提前过滤0值减少计算
GROUP BY
bl.agreement_id, blad.type_id, blad.ma_id, bl.id;
</select>
<select id="getListAll" resultType="java.lang.Integer">
SELECT
COUNT(*)
FROM
bm_loss_assign
</select>
<select id="getDeptId" resultType="java.lang.String">
select
project_leader_id as leaderId
from
data_center.dx_fb_son
where
id = #{externalId}
</select>
<select id="getUserNameById" resultType="java.lang.String">
select
account as userName
from
data_center.dc_user
where
id = #{leaderId}
</select>
<select id="getUserIdByUserName" resultType="com.bonus.common.biz.domain.lease.WorkPeopleInfo">
select
user_id as userId,
user_name as userName
from
sys_user
where user_name = #{userName}
</select>
<select id="getInfoById" resultType="com.bonus.material.lossAssessment.domain.LossAssignInfo">
SELECT DISTINCT
bla.id AS id,
bla.code AS code,
bla.create_time AS createTime,
bui.unit_id AS lossUnitId,
bui.unit_name AS lossUnitName,
bpl.pro_id AS lossProId,
bpl.pro_name AS lossProName,
bla.status as status,
bla.loss_url as lossUrl,
bla.loss_man as lossMan,
bla.phone as lossPhone,
bpl.external_id as lossExternalId
FROM
bm_loss_assign bla
LEFT JOIN bm_agreement_info bai ON bla.agreement_id = bai.agreement_id
LEFT JOIN bm_project bpl ON bpl.pro_id = bai.project_id
LEFT JOIN bm_unit bui ON bui.unit_id = bai.unit_id
WHERE
bla.del_flag = '1' and bla.id = #{id}
</select>
<select id="getDetailsById" resultType="com.bonus.material.lossAssessment.domain.LossAssignDetails">
SELECT blad.id AS id,
blad.loss_assign_id AS lossId,
blad.type_id AS typeId,
blad.ma_id AS maId,
blad.num AS lossNum,
mt1.type_name AS typeModelName,
mt2.type_name AS typeName,
mm.ma_code AS maCode,
mt1.unit_name AS unitName,
cla.lease_person AS leasePerson,
csi.start_time AS startTime,
bla.agreement_id AS agreementId,
SUM(CASE WHEN csi.status = '0' and mm.ma_status = '2' THEN IFNULL(csi.num, 0) ELSE 0 END) AS useNum
FROM bm_loss_assign_details blad
LEFT JOIN ma_type mt1 on mt1.type_id = blad.type_id
LEFT JOIN ma_type mt2 on mt2.type_id = mt1.parent_id
LEFT JOIN ma_machine mm on mm.ma_id = blad.ma_id
LEFT JOIN bm_loss_assign bla ON blad.loss_assign_id = bla.id
LEFT JOIN slt_agreement_info csi ON bla.agreement_id = csi.agreement_id
and csi.ma_id = mm.ma_id and csi.type_id = blad.type_id
LEFT JOIN lease_apply_info cla ON csi.lease_id = cla.id
WHERE blad.del_flag = '1' and blad.loss_assign_id = #{id}
GROUP BY
blad.type_id,
blad.ma_id
</select>
<select id="getDeptInfo" resultType="com.bonus.material.lossAssessment.domain.LossAssignInfo">
SELECT DISTINCT
df.project_dept AS lossDepartName,
sd.dept_name AS lossImpUnitName
FROM
bm_project bp
LEFT JOIN sys_dept sd ON sd.dept_id = bp.imp_unit
LEFT JOIN data_center.dx_fb_son df ON bp.external_id = df.id
WHERE
bp.pro_center IS NOT NULL
AND bp.external_id IS NOT NULL
AND bp.pro_id NOT IN ( 3414, 1192, 3321, 3595 )
AND bp.external_id = #{lossExternalId}
AND bp.del_flag = '0'
GROUP BY
bp.pro_name
LIMIT 1
</select>
<select id="getInfoDetails" resultType="com.bonus.material.lossAssessment.domain.LossAssignInfo">
SELECT DISTINCT
bla.id AS id,
bla.code AS code,
bla.create_time AS createTime,
su.nick_name AS createBy,
bui.unit_id AS lossUnitId,
bui.unit_name AS lossUnitName,
bpl.pro_id AS lossProId,
bpl.pro_name AS lossProName,
GROUP_CONCAT(DISTINCT mt2.type_name) as typeName,
bla.status as status,
swrs.direct_user as directUserIds,
swrs.node_id AS nodeId,
swrs.next_node_id AS nextNodeId,
swr.id AS recordId
FROM
bm_loss_assign bla
LEFT JOIN bm_agreement_info bai ON bla.agreement_id = bai.agreement_id
LEFT JOIN bm_project bpl ON bpl.pro_id = bai.project_id
LEFT JOIN bm_unit bui ON bui.unit_id = bai.unit_id
LEFT JOIN bm_loss_assign_details blad on blad.loss_assign_id = bla.id
LEFT JOIN ma_type mt1 on mt1.type_id = blad.type_id
LEFT JOIN ma_type mt2 on mt2.type_id = mt1.parent_id
left join sys_user su on bla.create_by = su.user_id
left join sys_workflow_record swr on bla.id = swr.task_id and swr.task_type = '26'
left join sys_workflow_type swt on swr.workflow_id = swt.id
left join sys_workflow_node swn on swt.id = swn.type_id
left join sys_workflow_config swc on swn.id = swc.node_id
left join (
select swrs.*
from sys_workflow_record_history swrs
inner join (
-- 第一步:按 record_id 分组,获取每组最新的 create_time
select record_id, max(create_time) as max_create_time
from sys_workflow_record_history
group by record_id
) t on swrs.record_id = t.record_id
and swrs.create_time = t.max_create_time
) swrs on swr.id = swrs.record_id
where
bla.del_flag = '1' and bla.id = #{id}
GROUP BY bla.id
ORDER BY bla.create_time desc
</select>
<select id="getUseList" resultType="com.bonus.common.biz.domain.lease.WorkPeopleInfo">
select
user_id as userId,
user_name as userName
from sys_user
where user_id = #{userId}
</select>
<select id="getList" resultType="com.bonus.material.lossAssessment.domain.LossAssignInfo">
SELECT * FROM (
SELECT DISTINCT
bla.id AS id,
bla.code AS code,
bla.create_time AS createTime,
su.nick_name AS createBy,
bui.unit_id AS lossUnitId,
bui.unit_name AS lossUnitName,
bpl.pro_id AS lossProId,
bpl.pro_name AS lossProName,
GROUP_CONCAT(DISTINCT mt2.type_name) as typeName,
bla.status as status,
swrs.direct_user as directUserIds,
swrs.node_id AS nodeId,
swrs.next_node_id AS nextNodeId,
swr.id AS recordId,
bla.create_by AS userId,
bui.bzz_idcard AS bzIdCard
FROM
bm_loss_assign bla
LEFT JOIN bm_agreement_info bai ON bla.agreement_id = bai.agreement_id
LEFT JOIN bm_project bpl ON bpl.pro_id = bai.project_id
LEFT JOIN bm_unit bui ON bui.unit_id = bai.unit_id
LEFT JOIN bm_loss_assign_details blad on blad.loss_assign_id = bla.id
LEFT JOIN ma_type mt1 on mt1.type_id = blad.type_id
LEFT JOIN ma_type mt2 on mt2.type_id = mt1.parent_id
left join sys_user su on bla.create_by = su.user_id
left join sys_workflow_record swr on bla.id = swr.task_id and swr.task_type = '26'
left join sys_workflow_type swt on swr.workflow_id = swt.id
left join sys_workflow_node swn on swt.id = swn.type_id
left join sys_workflow_config swc on swn.id = swc.node_id
left join (
select swrs.*
from sys_workflow_record_history swrs
inner join (
-- 第一步:按 record_id 分组,获取每组最新的 create_time
select record_id, max(create_time) as max_create_time
from sys_workflow_record_history
group by record_id
) t on swrs.record_id = t.record_id
and swrs.create_time = t.max_create_time -- 第二步:关联原表,获取最新时间对应的完整记录
) swrs on swr.id = swrs.record_id
<where>
bla.del_flag = '1'
<if test="status != null">
AND bla.status = #{status}
</if>
<if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
AND DATE_FORMAT( bla.create_time, '%Y-%m-%d' ) BETWEEN #{startTime} AND #{endTime}
</if>
<if test="projectIdList != null and projectIdList.size() > 0">
AND bpl.external_id in
<foreach item="item" collection="projectIdList" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="impUnit != null and impUnit != ''">
AND bpl.imp_unit = #{impUnit}
</if>
<if test="statusList != null and statusList.size() > 0">
AND bla.status in
<foreach item="item" collection="statusList" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
GROUP BY bla.id
ORDER BY bla.create_time desc
) a
<where>
<if test="keyWord!=null and keyWord!=''">
AND (
INSTR(a.typeName, #{keyWord}) > 0 OR
INSTR(a.lossUnitName, #{keyWord}) > 0 OR
INSTR(a.lossProName, #{keyWord}) > 0 OR
INSTR(a.code, #{keyWord}) > 0 OR
INSTR(a.createBy, #{keyWord}) > 0
)
</if>
</where>
</select>
<select id="selectMaTypeThreeLists" resultMap="TypeResult">
SELECT
m.type_id,
m.type_name,
m.parent_id,
m.manage_type,
m.`LEVEL`,
m.type_id AS id,
m.type_name AS label
FROM ma_type m
WHERE m.type_id IN (
-- 对三级节点去重
SELECT DISTINCT node_id
FROM (
-- 三级父节点
SELECT
mt.parent_id AS node_id
FROM (
SELECT DISTINCT sai.type_id
FROM slt_agreement_info sai
WHERE sai.agreement_id = #{agreementId} AND sai.STATUS = '0'
) AS sai_filtered
INNER JOIN ma_type mt ON mt.type_id = sai_filtered.type_id
WHERE mt.parent_id IS NOT NULL and mt.jiju_type = '2'
UNION ALL -- 二级父节点
SELECT
mt2.parent_id AS node_id
FROM (
SELECT DISTINCT sai.type_id
FROM slt_agreement_info sai
WHERE sai.agreement_id = #{agreementId} AND sai.STATUS = '0'
) AS sai_filtered
INNER JOIN ma_type mt ON mt.type_id = sai_filtered.type_id
INNER JOIN ma_type mt2 ON mt2.type_id = mt.parent_id
WHERE mt2.parent_id IS NOT NULL and mt.jiju_type = '2'
UNION ALL -- 一级父节点
SELECT
mt3.parent_id AS node_id
FROM (
SELECT DISTINCT sai.type_id
FROM slt_agreement_info sai
WHERE sai.agreement_id = #{agreementId} AND sai.STATUS = '0'
) AS sai_filtered
INNER JOIN ma_type mt ON mt.type_id = sai_filtered.type_id
INNER JOIN ma_type mt2 ON mt2.type_id = mt.parent_id
INNER JOIN ma_type mt3 ON mt3.type_id = mt2.parent_id
WHERE mt3.parent_id IS NOT NULL and mt.jiju_type = '2'
) AS all_nodes
);
</select>
<select id="getExternalId" resultType="com.bonus.material.lossAssessment.domain.LossAssignInfo">
select
external_id as lossExternalId,
pro_name as lossProName
from
bm_project
where
pro_id = #{projectId}
</select>
<select id="getNumList" resultType="com.bonus.material.lossAssessment.domain.LossAssignDetails">
SELECT
bl.id AS lossId,
bl.agreement_id AS agreementId,
blad.type_id AS typeId,
blad.ma_id AS maId,
SUM(IFNULL(blad.num, 0)) AS waitTransNum
FROM
bm_loss_assign bl
INNER JOIN bm_loss_assign_details blad ON bl.id = blad.loss_assign_id
WHERE
bl.`status` IN (0, 1)
AND bl.agreement_id = #{agreementId}
AND blad.type_id = #{typeId}
AND blad.ma_id = #{maId}
GROUP BY
bl.agreement_id, blad.type_id, blad.ma_id, bl.id
LIMIT 1
</select>
</mapper>

View File

@ -32,7 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update sys_workflow_record set workflow_id = #{workflowId} where id = #{id}
</update>
<delete id="deleteSysWorkflowRecord">
delete from sys_workflow_record where task_type = '25' AND task_id = #{taskId}
delete from sys_workflow_record where task_type = #{taskType} AND task_id = #{taskId}
</delete>
<delete id="deleteRecord">
delete from sys_workflow_record where task_Id = #{id}
@ -163,6 +163,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
task_type as taskType,
task_code as taskCode
from sys_workflow_record
where task_type = '25' AND task_id = #{id}
where task_type = #{taskType} AND task_id = #{taskId}
</select>
</mapper>