package com.fzzy.igds.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.fzzy.igds.constant.Constant; import com.fzzy.igds.constant.InoutConstant; import com.fzzy.igds.data.*; import com.fzzy.igds.domain.*; import com.fzzy.igds.mapper.InoutNoticeInMapper; import com.fzzy.igds.mapper.InoutNoticeOutMapper; import com.fzzy.igds.utils.ContextUtil; import com.fzzy.work.data.WorkBizType; import com.fzzy.work.data.WorkStatus; import com.fzzy.work.domain.WorkOrderConf; import com.fzzy.work.service.BizWorkService; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Description 出入库通知单service层,包含入库通知单和出库通知单 * @Author CZT * @Date 2025/11/29 16:33 */ @Slf4j @Service public class InoutNoticeService { @Resource private InoutNoticeInMapper noticeInMapper; @Resource private InoutNoticeOutMapper noticeOutMapper; @Resource private DepotService depotService; @Resource private CoreDeptService coreDeptService; @Resource private PledgeContractService pledgeContractService; @Resource private BizWorkService workService; /*----------------------入库通知单信息-------------------------*/ /** * 分页查询数据 * @param page * @param param */ public void pageQueryIn(Page page, NoticeParam param) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (null == param) { param = new NoticeParam(); } param.setCompanyId(ContextUtil.getCompanyId()); queryWrapper.eq("company_id", param.getCompanyId()); if (StringUtils.isNotBlank(param.getDeptId())) { queryWrapper.eq("dept_id", param.getDeptId()); } if (StringUtils.isNotBlank(param.getCustomerName())) { queryWrapper.like("customer_name", param.getCustomerName()); } if (StringUtils.isNotBlank(param.getFoodVariety())) { queryWrapper.like("food_variety", param.getFoodVariety()); } if (StringUtils.isNotBlank(param.getCompleteStatus())) { queryWrapper.like("complete_status", param.getCompleteStatus()); } queryWrapper.orderByDesc("id"); noticeInMapper.selectPage(page, queryWrapper); } /** * 根据条件查询 * @return */ public List getNoticeIn(NoticeParam param) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(param.getCompanyId())) { queryWrapper.eq("company_id", param.getCompanyId()); } if (StringUtils.isNotBlank(param.getDeptId())) { queryWrapper.eq("dept_id", param.getDeptId()); } if (StringUtils.isNotBlank(param.getAuditStatus())) { queryWrapper.eq("audit_status", param.getAuditStatus()); } if (StringUtils.isNotBlank(param.getCompleteStatus())) { queryWrapper.eq("complete_status", param.getCompleteStatus()); } if (StringUtils.isNotBlank(param.getKey())) { queryWrapper.like("name", param.getKey()); } queryWrapper.orderByDesc("create_time"); return noticeInMapper.selectList(queryWrapper); } /** * 根据条件查询 * @param id * @return */ public InoutNoticeIn getNoticeInOne(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", id); return noticeInMapper.selectOne(queryWrapper); } /** * 查询数据 * @param companyId * @return */ public List getUnComNoticeIn(String companyId) { if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } NoticeParam param = new NoticeParam(); param.setCompanyId(companyId); param.setCompleteStatus(Constant.COMPLETE_STATUS_NONE); return this.getNoticeIn(param); } /** * - 保存更新数据 * * @param data * @return */ @Transactional(rollbackFor = Exception.class) public BaseResp saveOrUpdateIn(InoutNoticeIn data) { //如果是库区自建通知单 if (InoutConstant.NOTICE_IN_TYPE_10.equals(data.getType())) { //获取质押合同数据 PledgeContract pledge = this.getPledgeByDepotId(data); if (null != pledge && pledge.getStatus().equals(Constant.YN_N)) { return BaseResp.error("当前仓库有未解押的质押合同,质押合同=" + pledge.getName()); } } //如果质押通知单 if (InoutConstant.NOTICE_IN_TYPE_20.equals(data.getType())) { //1.验证银行是否填写,未填写,则不允许保存 if (StringUtils.isEmpty(data.getBankId())) { return BaseResp.error("质押银行不能为空!"); } //2.验证银行和仓库的对应关系是否正确,不正确则不允许保存 PledgeContract pledge = this.getPledgeByDepotIdAndBankId(data); if (null == pledge) { return BaseResp.error("未获取到当前库区、仓库和银行之间的质押信息!"); } } //修改和提交是两个逻辑判断 if (null == data.getUpdateBy()) { return this.saveInAddStartWork(data); } else { data.setUpdateBy(ContextUtil.getLoginUserName()); data.setUpdateTime(new Date()); noticeInMapper.updateById(data); return BaseResp.success(); } } private BaseResp saveInAddStartWork(InoutNoticeIn data) { //数据保存 data.setUpdateBy(ContextUtil.getLoginUserName()); data.setUpdateTime(new Date()); data.setCreateBy(ContextUtil.getLoginUserName()); data.setCreateTime(new Date()); data.setAuditStatus(WorkStatus.STATUS_10.getCode()); data.setCompleteStatus(Constant.COMPLETE_STATUS_NONE); //执行流程 WorkOrderConf conf = workService.getConfByDeptId(data.getDeptId(), WorkBizType.TYPE_10); //流程不启用 if (null == conf || Constant.YN_N.equals(conf.getValTag())) { data.setAuditStatus(WorkStatus.STATUS_50.getCode()); } else { BaseResp resp = workService.startByNoticeIn(data, conf); log.info("---------启动工单流程------{}", resp); } noticeInMapper.insert(data); return BaseResp.success(); } /** * 判断当前仓库是否在质押合同中未解押 * @param data 当前数据 * @return true-在质押合同中未解押,false-在质押合同中已解押 */ private PledgeContract getPledgeByDepotId(InoutNoticeIn data) { IgdsBaseParam param = new IgdsBaseParam(); param.setCompanyId(data.getCompanyId()); param.setDeptId(data.getDeptId()); param.setDepotId(data.getDepotId()); return pledgeContractService.getByDepotId(param); } private PledgeContract getPledgeByDepotIdAndBankId(InoutNoticeIn data) { IgdsBaseParam param = new IgdsBaseParam(); param.setCompanyId(data.getCompanyId()); param.setDeptId(data.getDeptId()); param.setDepotId(data.getDepotId()); param.setBankId(data.getBankId()); return pledgeContractService.getByDepotId(param); } /** * 更新审核状态 * @param id * @param status */ public void updateNoticeInStatus(String id, String status) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", id).set("audit_status", status); noticeInMapper.update(null, updateWrapper); } /** * - 删除数据 * * @param data * @return */ public String delDataIn(InoutNoticeIn data) { noticeInMapper.deleteById(data); return null; } /*----------------------出库通知单信息-------------------------*/ /** * 分页查询数据 * @param page * @param param */ public void pageQueryOut(Page page, NoticeParam param) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (null == param) { param = new NoticeParam(); } param.setCompanyId(ContextUtil.getCompanyId()); queryWrapper.eq("company_id", param.getCompanyId()); if (StringUtils.isNotBlank(param.getDeptId())) { queryWrapper.eq("dept_id", param.getDeptId()); } if (StringUtils.isNotBlank(param.getCustomerName())) { queryWrapper.like("customer_name", param.getCustomerName()); } if (StringUtils.isNotBlank(param.getFoodVariety())) { queryWrapper.like("food_variety", param.getFoodVariety()); } if (StringUtils.isNotBlank(param.getCompleteStatus())) { queryWrapper.like("complete_status", param.getCompleteStatus()); } queryWrapper.orderByDesc("id"); noticeOutMapper.selectPage(page, queryWrapper); } /** * 根据条件查询 * @return */ public List getNoticeOut(NoticeParam param) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(param.getCompanyId())) { queryWrapper.eq("company_id", param.getCompanyId()); } if (StringUtils.isNotBlank(param.getDeptId())) { queryWrapper.eq("dept_id", param.getDeptId()); } if (StringUtils.isNotBlank(param.getAuditStatus())) { queryWrapper.eq("audit_status", param.getAuditStatus()); } if (StringUtils.isNotBlank(param.getCompleteStatus())) { queryWrapper.eq("complete_status", param.getCompleteStatus()); } if (StringUtils.isNotBlank(param.getKey())) { queryWrapper.like("name", param.getKey()); } queryWrapper.orderByDesc("create_time"); return noticeOutMapper.selectList(queryWrapper); } /** * 根据条件查询 * @param id * @return */ public InoutNoticeOut getNoticeOutOne(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", id); return noticeOutMapper.selectOne(queryWrapper); } /** * Mybatis-plus 获取信息 * @param companyId * @return */ public List getUnComNoticeOut(String companyId) { if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } NoticeParam param = new NoticeParam(); param.setCompanyId(companyId); param.setCompleteStatus(Constant.COMPLETE_STATUS_NONE); return this.getNoticeOut(param); } /** * - 保存更新数据 * * @param data * @return */ @Transactional(rollbackFor = Exception.class) public BaseResp saveOrUpdateOut(InoutNoticeOut data) { //如果出库通知单类型为库区通知单,验证仓库是否是未解押得仓库,是则不允许保存 if (InoutConstant.NOTICE_IN_TYPE_10.equals(data.getType())) { //在质押合同找到未解押,且质押仓库包含当前仓库的数据 //获取质押合同数据 PledgeContract pledge = this.getPledgeByDepotIdOut(data); if (null != pledge && pledge.getStatus().equals(Constant.YN_N)) { return BaseResp.error("当前仓库有未解押的质押合同,质押合同=" + pledge.getName()); } } //如果出库通知单类型为监管通知单 //如果质押通知单 if (InoutConstant.NOTICE_IN_TYPE_20.equals(data.getType())) { //1.验证银行是否填写,未填写,则不允许保存 if (StringUtils.isEmpty(data.getBankId())) { return BaseResp.error("质押银行不能为空!"); } //2.验证银行和仓库的对应关系是否正确,不正确则不允许保存 PledgeContract pledge = this.getPledgeByDepotIdAndBankIdOut(data); if (null == pledge) { return BaseResp.error("未获取到当前库区、仓库和银行之间的质押信息!"); } } if (null == data.getUpdateBy()) { return this.saveOutAddStartWork(data); } else { data.setUpdateBy(ContextUtil.getLoginUserName()); data.setUpdateTime(new Date()); noticeOutMapper.updateById(data); return BaseResp.success(); } } /** * 更新审核状态 * @param id * @param status */ public void updateNoticeOutStatus(String id, String status) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", id).set("audit_status", status); noticeOutMapper.update(null, updateWrapper); } /** * 删除数据 * * @param data * @return */ public String delDataOut(InoutNoticeOut data) { noticeOutMapper.deleteById(data); return null; } private BaseResp saveOutAddStartWork(InoutNoticeOut data) { //数据保存 data.setUpdateBy(ContextUtil.getLoginUserName()); data.setUpdateTime(new Date()); data.setCreateBy(ContextUtil.getLoginUserName()); data.setCreateTime(new Date()); data.setAuditStatus(WorkStatus.STATUS_10.getCode()); data.setCompleteStatus(Constant.COMPLETE_STATUS_NONE); //执行流程 WorkOrderConf conf = workService.getConfByDeptId(data.getDeptId(), WorkBizType.TYPE_20); //流程不启用 if (null == conf || Constant.YN_N.equals(conf.getValTag())) { data.setAuditStatus(WorkStatus.STATUS_50.getCode()); } else { BaseResp resp = workService.startByNoticeOut(data, conf); log.info("---------启动工单流程------{}", resp); } noticeOutMapper.insert(data); return BaseResp.success(); } /** * 判断当前仓库是否在质押合同中未解押 * @param data 当前数据 * @return true-在质押合同中未解押,false-在质押合同中已解押 */ private PledgeContract getPledgeByDepotIdOut(InoutNoticeOut data) { IgdsBaseParam param = new IgdsBaseParam(); param.setCompanyId(data.getCompanyId()); param.setDeptId(data.getDeptId()); param.setDepotId(data.getDepotId()); return pledgeContractService.getByDepotId(param); } private PledgeContract getPledgeByDepotIdAndBankIdOut(InoutNoticeOut data) { IgdsBaseParam param = new IgdsBaseParam(); param.setCompanyId(data.getCompanyId()); param.setDeptId(data.getDeptId()); param.setDepotId(data.getDepotId()); param.setBankId(data.getBankId()); return pledgeContractService.getByDepotId(param); } /** * 根据ID获取通知单信息 * @param id * @param type * @return */ public NoticeDto queryNoticeById(String id, String type) { if (StringUtils.isEmpty(id) || StringUtils.isEmpty(type)) { return null; } NoticeDto noticeDto = new NoticeDto(); if (Constant.TYPE_IN.equals(type)) { InoutNoticeIn noticeIn = this.getNoticeInOne(id); BeanUtils.copyProperties(noticeIn, noticeDto); } else { InoutNoticeOut noticeOut = this.getNoticeOutOne(id); BeanUtils.copyProperties(noticeOut, noticeDto); } return noticeDto; } /** * Mybatis-plus 更新信息 * @param noticeInList * @return */ public void updateSumNoticeIn(List noticeInList) { if (null == noticeInList || noticeInList.isEmpty()) { return; } //遍历通知单 NoticeParam param; for (InoutNoticeIn noticeIn : noticeInList) { param = new NoticeParam(noticeIn.getCompanyId(), noticeIn.getDeptId(), noticeIn.getCustomerName(), noticeIn.getFoodVariety(), noticeIn.getId()); log.info("开始更新出库通知单={}", param.toString()); String msg = this.reSumNoticeInComplete(param); if (msg != null) { log.info("入库通知单完成量统计失败={},失败原因={}", param.toString(), msg); } } } /** * Mybatis-plus 获取信息 * @param param * @return */ public String reSumNoticeInComplete(NoticeParam param) { //TODO 待实现,后续根据需求进行实现 if (StringUtils.isEmpty(param.getCustomerName())) { return "客户编码为空!"; } if (StringUtils.isEmpty(param.getFoodVariety())) { return "粮食品种为空!"; } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } return null; } /** * Mybatis-plus 更新信息 * @param noticeOutList * @return */ public void updateSumNoticeOut(List noticeOutList) { if (null == noticeOutList || noticeOutList.isEmpty()) { return; } //遍历通知单 NoticeParam param; for (InoutNoticeOut noticeOut : noticeOutList) { param = new NoticeParam(noticeOut.getCompanyId(), noticeOut.getDeptId(), noticeOut.getDepotId(), noticeOut.getCustomerName(), noticeOut.getFoodVariety(), noticeOut.getId()); log.info("开始更新出库通知单={}", param.toString()); String msg = this.reSumNoticeOutComplete(param); if (msg != null) { log.info("出库通知单完成量统计失败={},失败原因={}", param.toString(), msg); } } } /** * Mybatis-plus 更新信息 * @param param * @return */ public String reSumNoticeOutComplete(NoticeParam param) { //TODO 待实现,后续根据需求进行实现 if (StringUtils.isEmpty(param.getCustomerName())) { return "客户编码为空!"; } if (StringUtils.isEmpty(param.getFoodVariety())) { return "粮食品种为空!"; } if (StringUtils.isEmpty(param.getDepotId())) { return "仓库编码为空!"; } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(param.getDeptId())) { param.setDeptId(ContextUtil.subDeptId(null)); } return null; } /** * * @param param * @return */ public ExportWordParam handleInData(ExportWordParam param) { InoutNoticeIn notice = this.getNoticeInOne(param.getBizId()); //转换为模板需要的map数据源 Map map = new HashMap(); map.put("serId", notice.getId()); map.put("name", notice.getName()); String type = ""; if ("10".equals(notice.getType())) { type = "库区通知单"; } if ("20".equals(notice.getType())) { type = "监管通知单"; } map.put("type", type); map.put("customerName", notice.getCustomerName()); String unitName = ""; Dept dept = coreDeptService.getDeptById(notice.getUnitName()); if (dept != null) { unitName = dept.getKqmc(); } map.put("unitName", unitName); Depot depot = depotService.getCacheDepot(notice.getCompanyId(), notice.getDepotId()); String depotId = ""; if (dept != null) { depotId = depot.getName(); } map.put("depotId", depotId); map.put("year", notice.getYear()); map.put("targetNumber", notice.getTargetNumber()); map.put("completeNumber", notice.getCompleteNumber()); map.put("completeStatus", notice.getCompleteStatus()); map.put("contract", notice.getContract()); map.put("remark", notice.getRemark()); map.put("createUser", notice.getCreateBy()); map.put("createTime", DateFormatUtils.format(notice.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); param.setDataMap(map); return param; } /** * * @param param * @return */ public ExportWordParam handleOutData(ExportWordParam param) { InoutNoticeOut notice = this.getNoticeOutOne(param.getBizId()); //转换为模板需要的map数据源 Map map = new HashMap(); map.put("serId", notice.getId()); map.put("name", notice.getName()); String type = ""; if ("10".equals(notice.getType())) { type = "库区通知单"; } if ("20".equals(notice.getType())) { type = "监管通知单"; } map.put("type", type); map.put("customerName", notice.getCustomerName()); String unitName = ""; Dept dept = coreDeptService.getDeptById(notice.getUnitName()); if (dept != null) { unitName = dept.getKqmc(); } map.put("unitName", unitName); Depot depot = depotService.getCacheDepot(notice.getCompanyId(), notice.getDepotId()); String depotId = ""; if (dept != null) { depotId = depot.getName(); } map.put("depotId", depotId); map.put("year", notice.getYear()); map.put("targetNumber", notice.getTargetNumber()); map.put("completeNumber", notice.getCompleteNumber()); map.put("completeStatus", notice.getCompleteStatus()); map.put("contract", notice.getContract()); map.put("remark", notice.getRemark()); map.put("createUser", notice.getCreateBy()); map.put("createTime", DateFormatUtils.format(notice.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); param.setDataMap(map); return param; } }