package com.consum.base.controller; import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.exception.ExcelDataConvertException; import com.alibaba.fastjson.JSONObject; import com.consum.base.pojo.*; import com.consum.base.pojo.excel.ImportProcureOrderTemplate; import com.consum.base.pojo.excel.LWhFormTransferTemplate; import com.consum.base.pojo.query.WarehouseQry; import com.consum.base.service.*; import com.consum.base.util.DateUtil; import com.consum.base.util.ExcelStyleUtil; import com.consum.model.po.*; import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.ObjectUtils; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import com.consum.base.BaseController; import com.consum.base.core.WhBusinessEnum; import com.consum.base.core.type.StatesType; import com.consum.base.core.type.TransferStatesType; import com.consum.base.core.utils.CommonUtil; import com.consum.base.core.utils.IdUtil; import com.consum.base.pojo.dto.GoodsInfoDTO; import com.consum.base.pojo.dto.UseRecordDTO; import com.consum.base.pojo.excel.TransferExcelTemplate; import com.consum.base.pojo.query.TransferQry; import com.consum.base.pojo.request.LWhFormTransferParam; import com.consum.base.pojo.request.ProcureModelInfoParam; import com.consum.base.pojo.request.RecordInfoParam; import com.consum.base.pojo.response.FormTransferVO; import com.consum.base.pojo.response.GoodsTemplateCountVO; import com.consum.base.pojo.response.LWHFromTransferExtendVO; import com.consum.base.pojo.response.TransferInfoVO; import com.consum.base.service.core.LWhFormTransferCoreService; import com.iplatform.model.po.S_user_core; import com.walker.db.page.GenericPager; import com.walker.infrastructure.utils.CollectionUtils; import com.walker.infrastructure.utils.DateUtils; import com.walker.web.ResponseValue; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.hutool.core.util.ReflectUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.web.multipart.MultipartFile; /** * @Description 调拨管理 * @Author 卢庆阳 * @Date 2023/10/30 */ @RestController @RequestMapping("/pc/l/wh/form/transfer") @Api(value = "调拨分发管理", tags = "调拨分发管理") public class LWhFormTransferController extends BaseController { @Autowired private LWhFormTransferService lWhFormTransferService; @Autowired private LWhProcureModelService lWhProcureModelService; @Autowired private LWhFormTransferCoreService lWhFormTransferCoreService; @Autowired private LWhProcureModelUserService lWhProcureModelUserService; @Autowired private LWhProcureModelUserRecordService lWhProcureModelUserRecordService; @Autowired private LGoodsUserRecordCoreService lGoodsUserRecordCoreService; @Autowired private LWhGoodsService lWhGoodsService; @Autowired private BaseWarehouseService baseWarehouseService; @Autowired private FinSysTenantDepartmentService departmentService; @Autowired private BaseCategoryService baseCategoryService; @Autowired private BaseGoodsTemplateService baseGoodsTemplateService; @Autowired private BaseGoodsModelsService baseGoodsModelsService; /** * @Description 新增 */ @ApiOperation(value = "单据新增", notes = "单据新增") @ApiImplicitParam(name = "param", value = "单据新增", required = true, dataType = "LWhFormTransferParam") @PostMapping("/add") @Transactional(rollbackFor = Exception.class) public ResponseValue add() throws Exception { LWhFormTransferParam param = CommonUtil.getObjFromReqBody(LWhFormTransferParam.class); LWhFormTransferParam param2 = new LWhFormTransferParam(); CommonUtil.copyProperties(param, param2); param = param2; S_user_core currentUser = this.getCurrentUser(); if (currentUser == null) { return ResponseValue.error("登录用户信息不存在"); } List transferGoods = param.getTransferGoods(); if (CollectionUtils.isEmpty(transferGoods)) { return ResponseValue.error("调拨单不能为空"); } long id = this.lWhFormTransferService.add(param, this.getSysInfo(), StrUtil.isEmpty(param.getProcureDoc())); if (id == -1L) { return ResponseValue.error("您不是库管员"); } if (id == -2L) { return ResponseValue.error("仓库不存在"); } Integer transferBusinessType = param.getTransferBusinessType(); // 部门分发业务需要处理 // 拆分 新逻辑 if (transferBusinessType == 1 && !StrUtil.isEmpty(param.getProcureDoc())) { // 先出库,再入库 // 出库前 设置出库仓库 List modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id); Set baseModelIds = modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet()); FinSysTenantUser sysTenantUser = this.getSysInfo(); String agencyId = sysTenantUser.getTenantId(); List baseWarehouseList = baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue()); Set wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet()); // 通过调拨单中的型号id查询出该型号物品所在的仓库位置 List goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null); GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null); if (ObjectUtils.isEmpty(goodsInfoDTO)) { return ResponseValue.error("该型号没有库存可使用"); } Long wareHouseId = goodsInfoDTO.getWarehouseId(); String warehouseName = goodsInfoDTO.getWarehouseName(); LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id); lWhFormTransfer.setOutWarehouseId(wareHouseId); lWhFormTransfer.setOutWarehouseName(warehouseName); lWhFormTransferService.update(lWhFormTransfer); Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA); if (l == -1L) { return ResponseValue.error("仓库数量不足"); } lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName()); } return ResponseValue.success(); } public ResponseValue add2(LWhFormTransferParam param) throws Exception { S_user_core currentUser = this.getCurrentUser(); if (currentUser == null) { return ResponseValue.error("登录用户信息不存在"); } List transferGoods = param.getTransferGoods(); if (CollectionUtils.isEmpty(transferGoods)) { return ResponseValue.error("调拨单不能为空"); } FinSysTenantUser sysInfo = this.getSysInfo(); long id = this.lWhFormTransferService.add(param, sysInfo, true); if (id == -1L) { return ResponseValue.error("您不是库管员"); } if (id == -2L) { return ResponseValue.error("仓库不存在"); } Integer transferBusinessType = param.getTransferBusinessType(); // 部门分发业务需要处理 // todo 拆分 新逻辑 if (transferBusinessType == 1 && !StrUtil.isEmpty(param.getProcureDoc())) { // 先出库,再入库 // 出库前 设置出库仓库 List modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id); Set baseModelIds = modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet()); FinSysTenantUser sysTenantUser = this.getSysInfo(); String agencyId = sysTenantUser.getTenantId(); List baseWarehouseList = baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue()); Set wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet()); // 通过调拨单中的型号id查询出该型号物品所在的仓库位置 List goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null); GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null); if (ObjectUtils.isEmpty(goodsInfoDTO)) { return ResponseValue.error("该型号没有库存可使用"); } Long wareHouseId = goodsInfoDTO.getWarehouseId(); String warehouseName = goodsInfoDTO.getWarehouseName(); LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id); lWhFormTransfer.setOutWarehouseId(wareHouseId); lWhFormTransfer.setOutWarehouseName(warehouseName); lWhFormTransferService.update(lWhFormTransfer); Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA); if (l == -1L) { return ResponseValue.error("仓库数量不足"); } lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName()); } return ResponseValue.success(); } /** * 上传分发单(流程修改) * * @param idStr 调拨单id json * @return * @throws Exception */ @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),}) @Transactional(rollbackFor = Exception.class) @PostMapping("import") public ResponseValue upload(@RequestBody String idStr) throws Exception { Map map = JSONObject.parseObject(idStr, Map.class); String type = map.get("type").toString(); Long id = Convert.toLong(map.get("idStr")); String procureDoc = map.get("procureDoc").toString(); // [调拨] if ("0".equals(type)) { // 修改 LWhFormTransfer addLWhFormTransfer = new LWhFormTransfer(); addLWhFormTransfer.setId(id); addLWhFormTransfer.setProcureDoc(procureDoc); int update = lWhFormTransferService.update(addLWhFormTransfer); if (update < 1) { return ResponseValue.error(); } return ResponseValue.success(); } // [分发] Long opTime = Convert.toLong(map.get("opTime")); // 修改表的文件逻辑 LWHFromTransferExtendVO lwhFromTransferExtendVO = lWhFormTransferService.getById(id); // 修改 LWhFormTransfer addLWhFormTransfer = new LWhFormTransfer(); addLWhFormTransfer.setId(id); addLWhFormTransfer.setProcureDoc(procureDoc); addLWhFormTransfer.setInTime(opTime); addLWhFormTransfer.setOutputTime(opTime); int update = lWhFormTransferService.update(addLWhFormTransfer); if (update < 1) { return ResponseValue.error(); } // 主分发逻辑 // 先出库,再入库 // 出库前 设置出库仓库 List modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id); Set baseModelIds = modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet()); FinSysTenantUser sysTenantUser = this.getSysInfo(); String agencyId = sysTenantUser.getTenantId(); List baseWarehouseList = baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue()); Set wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet()); // 通过调拨单中的型号id查询出该型号物品所在的仓库位置 List goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null); GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null); if (ObjectUtils.isEmpty(goodsInfoDTO)) { return ResponseValue.error("该型号没有库存可使用"); } Long wareHouseId = goodsInfoDTO.getWarehouseId(); String warehouseName = goodsInfoDTO.getWarehouseName(); LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id); lWhFormTransfer.setOutWarehouseId(wareHouseId); lWhFormTransfer.setOutWarehouseName(warehouseName); lWhFormTransferService.update(lWhFormTransfer); lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA); lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), lwhFromTransferExtendVO.getOperatorName()); return ResponseValue.success(); } /** * @Description 列表查询(调拨明细) * @Author 卢庆阳 * @Date 2023/10/30 *

* 1.查询调拨单 *

* 2.查询物品型号 */ @ApiOperation(value = "单据列表查询", notes = "单据列表查询") @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", required = true, dataType = "int"), @ApiImplicitParam(name = "size", value = "每页条数", required = true, dataType = "int"), @ApiImplicitParam(name = "param", value = "条件参数", required = true, dataType = "TransferQry"),}) @GetMapping("/list") public ResponseValue queryFormTransferList() { TransferQry param = CommonUtil.getObjFromReq(TransferQry.class); TransferQry param2 = new TransferQry(); CommonUtil.copyProperties(param, param2); param = param2; S_user_core currentUser = this.getCurrentUser(); if (currentUser == null) { return ResponseValue.error("登录用户信息不存在"); } /*当前登录人只能看到自己机构下的列表*/ GenericPager genericPager = lWhFormTransferService.queryFormTransferList(param); List datas = genericPager.getDatas(); ArrayList result = new ArrayList<>(); if (!CollectionUtils.isEmpty(datas)) { datas.forEach(item -> { FormTransferVO formTransferVO = new FormTransferVO(); BeanUtils.copyProperties(item, formTransferVO); // 查询型号数量 List goodsTemplateCount = lWhProcureModelService.getGoodsTemplateCountByBusinessId(item.getId()); formTransferVO.setFromTransferTemplateInfoList(goodsTemplateCount); result.add(formTransferVO); }); } try { Field fieldDatas = GenericPager.class.getDeclaredField("datas"); // fieldDatas.setAccessible(true); // fieldDatas.set(genericPager, result); ReflectUtil.setFieldValue(genericPager, fieldDatas, result); } catch (Exception e) { e.printStackTrace(); } return ResponseValue.success(genericPager); } /** * @Description 根据id查询详情 * @Author 卢庆阳 * @Date 2023/10/30 */ @ApiOperation(value = "根据id查询详情", notes = "根据id查询详情") @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),}) @GetMapping("/detail") public ResponseValue getById(Long id) { if (id == null) { return ResponseValue.error("调拨单id为空"); } LWHFromTransferExtendVO vo = this.lWhFormTransferService.getById(id); return ResponseValue.success(vo); } @ApiOperation(value = "调拨明细列表", notes = "调拨明细列表") @ApiImplicitParams({@ApiImplicitParam(name = "param", value = "条件", required = true, dataType = "TransferQry"),}) @GetMapping("/detail/list") public ResponseValue queryFormTransferDetailList() { TransferQry param = CommonUtil.getObjFromReq(TransferQry.class); TransferQry param2 = new TransferQry(); CommonUtil.copyProperties(param, param2); param = param2; FinSysTenantUser sysInfo = this.getSysInfo(); if (sysInfo == null) { return ResponseValue.error("登录用户信息不存在"); } String tenantId = sysInfo.getTenantId(); if (param.getInAgencyId() == null) { param.setInAgencyId(Long.valueOf(tenantId)); } GenericPager> mapGenericPager = lWhFormTransferService.queryFormTransferDetailList(param); return ResponseValue.success(mapGenericPager); } /** * 撤销 * * @author 卢庆阳 * @date 2023/10/31 */ @ApiOperation(value = "撤销", notes = "撤销") @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),}) @PostMapping("/updStatus") public ResponseValue updateStatus(Long id) { if (id == null) { return ResponseValue.error("参数错误"); } LWhFormTransfer lWhFormTransfer = lWhFormTransferService.selectById(id); if (lWhFormTransfer.getStates() != TransferStatesType.OUT_PENDING.getValue()) { return ResponseValue.error("状态错误,不能撤销"); } int num = this.lWhFormTransferService.updateStatus(id); return num > 0 ? ResponseValue.success(1) : ResponseValue.error("修改失败!"); } /** * @Description 调拨入库 * @Author 卢庆阳 * @Date 2023/10/31 */ @ApiOperation(value = "调拨入库", notes = "调拨入库") @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),}) @PostMapping("/income") public ResponseValue income(Long id) throws Exception { lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), null); return ResponseValue.success(); } /** * @Description 调拨出库 * @Author 卢庆阳 * @Date 2023/10/31 */ @ApiOperation(value = "调拨出库", notes = "调拨出库") @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),}) @PostMapping("/output") public ResponseValue output(Long id) throws Exception { List modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.DIAOBO, id); Set baseModelIds = modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet()); FinSysTenantUser sysTenantUser = this.getSysInfo(); String agencyId = sysTenantUser.getTenantId(); List baseWarehouseList = baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue()); Set wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet()); // 通过调拨单中的型号id查询出该型号物品所在的仓库位置 List goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, 1); GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null); if (ObjectUtils.isEmpty(goodsInfoDTO)) { return ResponseValue.error("该型号没有库存可使用"); } Long wareHouseId = goodsInfoDTO.getWarehouseId(); String warehouseName = goodsInfoDTO.getWarehouseName(); LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id); lWhFormTransfer.setOutWarehouseId(wareHouseId); lWhFormTransfer.setOutWarehouseName(warehouseName); lWhFormTransferService.update(lWhFormTransfer); // lWhFormTransferCoreService.doTransferOutPut(id, getCurrentUser()); lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.DIAOBO); return ResponseValue.success(); } @ApiOperation(value = "调拨单导出", notes = "调拨单导出") @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"), @ApiImplicitParam(name = "type", value = "导出类型 1 入库 2 出库", required = true, dataType = "Integer"),}) @GetMapping("/list/export") public ResponseValue export(Long id, Integer type, HttpServletResponse response) throws Exception { TemplateExportParams params; String fileName; if (type == 0) { params = new TemplateExportParams("import/调拨入库单.xls"); fileName = "调拨入库单"; } else if (type == 1) { params = new TemplateExportParams("import/调拨入库单1.xls"); fileName = "调拨入库单"; } else { params = new TemplateExportParams("import/调拨出库单.xls"); fileName = "调拨出库单"; } params.setHeadingStartRow(2); params.setStyle(ExcelStyleUtil.class); List export = this.lWhFormTransferService.export(id, type); int countNum = export.stream().filter(item -> item.getNum() != null).mapToInt(TransferExcelTemplate::getNum).sum(); double totalAmount = export.stream().filter(item -> item.getTotalAmount() != null) .mapToDouble(TransferExcelTemplate::getAmount).sum(); Optional first = export.stream().findFirst(); TransferExcelTemplate entity = first.get(); String businessFormCode = entity.getBusinessFormCode(); Long createTime = entity.getCreateTime(); String operatorName = entity.getOperatorName(); String tenantName = entity.getTenantName(); Map map = new HashMap<>(); map.put("code", businessFormCode); map.put("date", DateUtils.toShowDate(createTime)); map.put("tenantName", tenantName); map.put("name", operatorName); map.put("countNum", countNum); map.put("totalAmount", totalAmount); Workbook workbook = ExcelExportUtil.exportExcel(params, TransferExcelTemplate.class, export, map); String filePath = downLoadExcel(fileName, workbook); return ResponseValue.success("导出成功", filePath); } /** * 部门物品分发列表明细 * * @param * @return */ @ApiOperation(value = "部门物品分发列表明细", notes = "部门物品分发列表明细") @ApiImplicitParams({@ApiImplicitParam(name = "transferQryDto", value = "调拨单查询条件", required = true)}) @GetMapping("/department/list") public ResponseValue departmentTransferList() { TransferQry param = CommonUtil.getObjFromReq(TransferQry.class); TransferQry param2 = new TransferQry(); CommonUtil.copyProperties(param, param2); param = param2; FinSysTenantUser sysInfo = this.getSysInfo(); if (sysInfo == null) { return ResponseValue.error("登录用户信息不存在"); } String tenantId = sysInfo.getTenantId(); if (param.getOutAgencyId() == null) { param.setOutAgencyId(Long.valueOf(tenantId)); } GenericPager> transferInfoDetailsVoGenericPager = this.lWhFormTransferService.queryTransferInfo(param); return ResponseValue.success(transferInfoDetailsVoGenericPager); } @ApiOperation(value = "使用人修改", notes = "使用人修改") @ApiImplicitParams({@ApiImplicitParam(name = "procureModelInfoDto", value = "使用信息", required = true)}) @PostMapping("/useInfo/update") public ResponseValue infoUpdate() { RecordInfoParam param = CommonUtil.getObjFromReqBody(RecordInfoParam.class); RecordInfoParam recordInfoParam = new RecordInfoParam(); CommonUtil.copyProperties(param, recordInfoParam); param = recordInfoParam; S_user_core currentUser = this.getCurrentUser(); if (currentUser == null) { return ResponseValue.error("登录用户信息不存在"); } if (CollectionUtils.isEmpty(param.getRecordInfoList())) { return ResponseValue.error("参数错误"); } Map> collect = param.getRecordInfoList().stream() .collect(Collectors.groupingBy(ProcureModelInfoParam::getBaseGoodModelId)); for (Map.Entry> entry : collect.entrySet()) { Long baseGoodModelId = entry.getKey(); List procureModelInfoList = entry.getValue(); Optional first = procureModelInfoList.stream().findFirst(); ProcureModelInfoParam procureModelInf = first.get(); Long businessId = procureModelInf.getBusinessId(); LWhProcureModelUserRecord lWhProcureModelUserRecord = new LWhProcureModelUserRecord(); lWhProcureModelUserRecord.setId(IdUtil.generateId()); lWhProcureModelUserRecord.setTransBusinessId(businessId); FinSysTenantUser sysInfo = getSysInfo(); lWhProcureModelUserRecord.setOperatorId(sysInfo.getId()); lWhProcureModelUserRecord.setOperatorName(sysInfo.getUserName()); lWhProcureModelUserRecord.setDealTime(DateUtils.getDateTimeNumber(System.currentTimeMillis())); lWhProcureModelUserRecordService.insert(lWhProcureModelUserRecord); List procureModelUserList = Lists.newArrayList(); if (!CollectionUtils.isEmpty(procureModelInfoList)) { for (ProcureModelInfoParam item : procureModelInfoList) { LWhProcureModelUser lWhProcureModelUser = new LWhProcureModelUser(); lWhProcureModelUser.setId(IdUtil.generateId()); lWhProcureModelUser.setTransBusinessId(businessId); lWhProcureModelUser.setProcureModelUserRecordId(lWhProcureModelUserRecord.getId()); lWhProcureModelUser.setWhProcureModelId(procureModelInf.getProcureModelId()); lWhProcureModelUser.setBaseGoodsModelsId(baseGoodModelId); lWhProcureModelUser.setNowUserPhone(item.getPhone()); lWhProcureModelUser.setNowUserName(item.getUserName()); lWhProcureModelUser.setGoodsNum(item.getCount()); // 设置一下在用数量 Long oldProcureModelId = item.getOldProcureModelId(); LWhProcureModelUser oldInfo = lWhProcureModelUserService.get(new LWhProcureModelUser(oldProcureModelId)); lWhProcureModelUser.setUseCount(oldInfo.getUseCount()); procureModelUserList.add(lWhProcureModelUser); } lWhProcureModelUserService.insert(procureModelUserList); } // 使用人修改调用 lGoodsUserRecordCoreService.modifyGoodsUser(null, lWhProcureModelUserRecord.getId()); } return ResponseValue.success(); } /** * 部门物品使用记录 * * @param transferOrderId * @return */ @ApiOperation(value = "部门物品使用人记录", notes = "部门物品使用人记录") @ApiImplicitParams({@ApiImplicitParam(name = "transferOrderId", value = "调拨单id", required = true)}) @GetMapping("/use/record") public ResponseValue useRecord(Long transferOrderId) { S_user_core currentUser = this.getCurrentUser(); if (currentUser == null) { return ResponseValue.error("登录用户信息不存在"); } List useRecordDTOList = lWhProcureModelUserService.selectUseRecord(transferOrderId); if (CollectionUtils.isEmpty(useRecordDTOList)) { return ResponseValue.error("未查询到使用记录"); } List goodsUseRecordList = useRecordDTOList.stream() .collect(Collectors.groupingBy(UseRecordDTO::getId)).entrySet().stream().map(entry -> { Long id = entry.getKey(); List useRecordList = entry.getValue(); UseRecordDTO useRecordDto = useRecordList.get(0); GoodsUseRecordVO goodsUseRecordVO = new GoodsUseRecordVO(); goodsUseRecordVO.setId(id); goodsUseRecordVO.setUpdateUserName(useRecordDto.getUpdateUserName()); goodsUseRecordVO.setUpdateTime(useRecordDto.getUpdateTime()); List useRecordSkuList = useRecordList.stream().collect(Collectors.groupingBy(UseRecordDTO::getProcureModelId)).values() .stream().map(recordList -> { UseRecordDTO useRecordDTO = recordList.get(0); UseRecordSkuVO useRecordSkuVO = new UseRecordSkuVO(); useRecordSkuVO.setBaseGoodModelId(useRecordDTO.getBaseGoodsModelsId()); useRecordSkuVO.setBaseGoodModelName(useRecordDTO.getBaseGoodsModelsName()); useRecordSkuVO.setUnit(useRecordDTO.getUnit()); useRecordSkuVO.setProcureModelId(useRecordDTO.getProcureModelId()); List recordUserInfoList = recordList.stream().map(userInfo -> { RecordUserInfoVO recordUserInfoVO = new RecordUserInfoVO(); recordUserInfoVO.setOldProcureModelId(userInfo.getOldProcureModelId()); recordUserInfoVO.setUseName(userInfo.getUseName()); recordUserInfoVO.setPhone(userInfo.getPhone()); recordUserInfoVO.setNum(userInfo.getNum()); return recordUserInfoVO; }).collect(Collectors.toList()); useRecordSkuVO.setRecordUserInfos(recordUserInfoList); return useRecordSkuVO; }).collect(Collectors.toList()); goodsUseRecordVO.setRecordSkuDtoList(useRecordSkuList); return goodsUseRecordVO; }).sorted(Comparator.comparing(GoodsUseRecordVO::getUpdateTime, Comparator.nullsFirst(Long::compareTo)) .reversed()) .collect(Collectors.toList()); return ResponseValue.success(goodsUseRecordList); } @ApiOperation(value = "查询部门下的分发单", notes = "查询部门下的分发单") @ApiImplicitParams({ @ApiImplicitParam(name = "agencyId", value = "机构id", required = true, dataType = "Long", paramType = "query")}) @GetMapping("/query/transfList") public ResponseValue queryDepartmentTransferOrderList() { TransferInfoVO transferInfoVO = new TransferInfoVO(); lWhFormTransferService.queryDepartmentTransferOrder(); return ResponseValue.success(transferInfoVO); } /** * 分发单导入 * * @param file * @return */ @ApiOperation(value = "分发单导入", notes = "分发单导入") @PostMapping("/import2") public ResponseValue import2(MultipartFile file) { String originalFilename = file.getOriginalFilename(); // 文件格式校验 // if (!".xls".endsWith(originalFilename)) { // return ResponseValue.error("文件格式有误!"); // } FinSysTenantUser sysInfo = this.getSysInfo(); if (sysInfo == null) { return ResponseValue.error("当前登录用户为空"); } try { EasyExcelFactory.read(file.getInputStream(), LWhFormTransferTemplate.class, new AnalysisEventListener() { /** * 分发单主数据 */ final List list = Lists.newArrayList(); /** * 分发单的外层的主数据 */ final LWhFormTransferParam lWhFormTransferParam = new LWhFormTransferParam(); /** * 行索引 */ Integer index = 0; /** * 表头信息 * @param headMap * @param context */ @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { // 验证表头数量 logger.info("解析分发单的表头长度: {}", headMap.size()); if (headMap.size() != 15) { throw new ExcelAnalysisException("上传的文件不符!"); } } /** * 导入主(文件数据处理) * @param data * @param analysisContext */ @Override public void invoke(LWhFormTransferTemplate data, AnalysisContext analysisContext) { index++; String categoryOne = data.getCategoryOne(); String categoryTwo = data.getCategoryTwo(); String categoryThree = data.getCategoryThree(); if (StrUtil.isEmpty(categoryThree)) { throw new ExcelAnalysisException("第" + index + "条数据,品类名称不能为空:" + categoryThree); } String goodsName = data.getGoodsName(); if (StrUtil.isEmpty(goodsName)) { throw new ExcelAnalysisException("第" + index + "条数据,品名不能为空:" + goodsName); } String goodModelName = data.getGoodModelName(); if (StrUtil.isEmpty(goodModelName)) { throw new ExcelAnalysisException("第" + index + "条数据,规格型号不能为空:" + goodModelName); } String unit = data.getUnit(); String type = data.getType(); if (StrUtil.isEmpty(type)) { throw new ExcelAnalysisException("第" + index + "条数据,管理分类不能为空:" + type); } String agencyName = data.getAgencyName(); if (StrUtil.isEmpty(agencyName)) { throw new ExcelAnalysisException("第" + index + "条数据,创建机构不能为空:" + agencyName); } //String warehouseName = data.getWarehouseName(); String supplierName = data.getSupplierName(); //String price = data.getPrice(); String num = data.getNum(); if (StrUtil.isEmpty(num)) { throw new ExcelAnalysisException("第" + index + "条数据,领用数量不能为空:" + num); } // 物品类型(自采集采) //String goodsType = data.getGoodsType(); // 使用人部门 String userDepartment = data.getUserDepartment(); if (StrUtil.isEmpty(userDepartment)) { throw new ExcelAnalysisException("第" + index + "条数据,使用人部门不能为空:" + userDepartment); } // 填报人 String reportedBy = data.getReportedBy(); if (StrUtil.isEmpty(reportedBy)) { throw new ExcelAnalysisException("第" + index + "条数据,填报人不能为空:" + reportedBy); } // 使用人 String user = data.getUser(); if (StrUtil.isEmpty(user) && type.equals("A")) { throw new ExcelAnalysisException("第" + index + "条数据,管理分类为A的物品,使用人不能为空:" + user); } // 联系电话 String userContactPhone = data.getUserContactPhone(); if (StrUtil.isEmpty(userContactPhone)) { throw new ExcelAnalysisException("第" + index + "条数据,联系电话不能为空:" + userContactPhone); } // 第一次进来把外层的值设置一下 if (StrUtil.isEmpty(lWhFormTransferParam.getDepartmentName())) { // 机构id (根据 机构名称和部门名称 查找对应的id) FinSysTenantDepartment finSysTenantDepartment = departmentService.queryIdByTenDepName(agencyName, userDepartment); if (finSysTenantDepartment == null) { throw new ExcelAnalysisException("第" + index + "条数据 " + "机构-部门未找到:[" + agencyName + "-" + userDepartment + "]"); } lWhFormTransferParam.setTransferBusinessType(1); lWhFormTransferParam.setDepartmentId(finSysTenantDepartment.getId()); lWhFormTransferParam.setDepartmentName(userDepartment); lWhFormTransferParam.setOperatorName(reportedBy); lWhFormTransferParam.setTel(0L); lWhFormTransferParam.setCreateTime(DateUtil.getNowDate()); lWhFormTransferParam.setProcureDoc(""); lWhFormTransferParam.setOutAgencyId(finSysTenantDepartment.getTenantId()); } // 查询分类id BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree); if (baseCategory == null) { throw new ExcelAnalysisException("第" + index + "条数据" + "此分类未找到:" + categoryThree); } Long categoryId = baseCategory.getId(); // 不同采集类型,不同筛选 Optional optional = null; // 筛选类型 optional = list.stream().filter(item -> item.getBaseCategoryId().equals(categoryId)).findFirst(); // 筛选物品名 Optional optional2 = list.stream().filter(item -> item.getGoodsTemplateName().equals(goodsName)).findFirst(); // 数据第二层-物品的id BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId); if (goodsTemplate == null) { throw new ExcelAnalysisException("第" + index + "条数据" + "此物品未找到:" + goodsName); } if (optional.isPresent() && optional2.isPresent()) { // 内层list(领用人) List models3 = optional.get().getModels(); // 找型号名字一样的 Optional optional3 = models3.stream().filter(item -> item.getBaseGoodsModelsName().equals(goodModelName)).findFirst(); int counts = 0; for (LWhTransferModelParam m : models3) { int addNum = 0; if (m.getNum() != null) { addNum = m.getCounts(); } counts += addNum; } // 同一个型号的 if (optional3.isPresent()) { if ("A".equals(type)) { LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam(); lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num)); lWhProcureModelUserParam.setNowUserName(user); lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone)); Integer counts1 = optional3.get().getCounts(); Integer num1 = optional3.get().getNum(); optional3.get().setCounts(Integer.valueOf(num) + counts1); optional3.get().setNum(Integer.valueOf(num) + num1); optional3.get().getProcureModelUserList().add(lWhProcureModelUserParam); } else { Integer counts1 = optional3.get().getCounts(); Integer num1 = optional3.get().getNum(); optional3.get().setCounts(Integer.valueOf(num) + counts1); optional3.get().setNum(Integer.valueOf(num) + num1); } } else { // 此物品另外的规格型号 LWhTransferModelParam lWhTransferModelParam = new LWhTransferModelParam(); // 模板的id BaseGoodsModels selBaseGoodsModels = new BaseGoodsModels(); selBaseGoodsModels.setModelName(goodModelName); selBaseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId()); BaseGoodsModels selByModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(selBaseGoodsModels); if (selByModelNameAndGoodsTemplatesId == null) { throw new ExcelAnalysisException("第" + index + "条数据" + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到"); } lWhTransferModelParam.setBaseGoodsModelsId(selByModelNameAndGoodsTemplatesId.getId()); // 内层list的数量之和 lWhTransferModelParam.setCounts(Integer.valueOf(num)); // 模板名称 lWhTransferModelParam.setBaseGoodsModelsName(goodModelName); List addLWhProcureModelUserParam = new ArrayList<>(); LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam(); lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num)); // 查询库存数量 Integer nowNum = selectAllNumber(lWhFormTransferParam.getOutAgencyId(), selByModelNameAndGoodsTemplatesId.getId()); if(nowNum lWhFormProcureGoodsInfoParam = new ArrayList<>(); LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam(); lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num)); // 查询库存数量 Integer nowNum = selectAllNumber(lWhFormTransferParam.getOutAgencyId(), selByModelNameAndGoodsTemplatesId.getId()); if(nowNum lWhTransferModelParams = new ArrayList<>(); lWhTransferModelParams.add(lWhTransferModelParam); lWhFormTransferGoodsInfoParam.setModels(lWhTransferModelParams); lWhFormTransferGoodsInfoParam.setType(type); list.add(lWhFormTransferGoodsInfoParam); } } /** * 分发单导入主方法 * @param analysisContext */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { lWhFormTransferParam.setTransferGoods(list); long id = IdUtil.generateId(); //lWhFormTransferParam.setProcureDoc("[{\"fileType\":\"png\",\"id\":\"883654049218335\",\"name\":\"微信截图_20240426143552.png\",\"url\":\"http://172.16.60.172:8083/lowConsum/file/2024/5/883654049218335.png\",\"path\":\"2024/5/883654049218335.png\",\"attSize\":6772}]"); lWhFormTransferParam.setProcureDoc("-"); lWhFormTransferParam.setId(id); String jsonString = JSONObject.toJSONString(lWhFormTransferParam); logger.info("导入分发单json数据 --------------------"); logger.info(jsonString); // 分发单据 try { ResponseValue responseValue = add2(lWhFormTransferParam); logger.info(responseValue.toString()); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @Override public void onException(Exception exception, AnalysisContext analysisContext) throws Exception { if (exception instanceof ExcelDataConvertException) { ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; Integer row = excelDataConvertException.getRowIndex() + 1; Integer column = excelDataConvertException.getColumnIndex() + 1; throw new ExcelAnalysisException("第" + row + "行,第" + column + "列解析异常,请正确填写"); } else { throw new ExcelAnalysisException(exception.getMessage()); } } }).sheet(0).doRead(); } catch (ExcelAnalysisException e) { return ResponseValue.error(e.getMessage()); } catch (RuntimeException e) { e.printStackTrace(); return ResponseValue.error("系统错误"); } catch (Exception e) { e.printStackTrace(); return ResponseValue.error("系统错误"); } return ResponseValue.success("导入成功!"); } /** * 查询库存Id * @param agencyId * @param baseGoodsModelsId * @return */ public Integer selectAllNumber(Long agencyId,Long baseGoodsModelsId) { WarehouseQry warehouseQry = new WarehouseQry(); warehouseQry.setAgencyId(agencyId); warehouseQry.setBaseGoodsModelsId(baseGoodsModelsId); List baseWarehouseList = baseWarehouseService.getBaseWareHouseList(agencyId, StatesType.NORMAL.getValue()); List warehouseIdList = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toList()); Integer warehouseType = warehouseQry.getWarehouseType(); Integer states = warehouseQry.getStates(); Integer buyType = warehouseQry.getBuyType(); // 调拨时只查机构类型的集采仓库库存 // 部门分发时不分机构和部门,因为调拨进来的物品也算在库存里只是类型为部门,同样检视所有仓库该型号的数量 int num = lWhGoodsService.queryGoodsModelInWareHouseNum(warehouseType, warehouseIdList, baseGoodsModelsId, states, buyType); return num; } }