package com.consum.base.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.consum.base.core.CodeGeneratorEnum; import com.consum.base.core.CodeGeneratorService; import com.consum.base.core.WhBusinessEnum; import com.consum.base.core.utils.CurrencyUtil; import com.consum.base.core.utils.IdUtil; import com.consum.base.core.utils.MapUtils; import com.consum.base.core.utils.MapperUtil; import com.consum.base.core.utils.PageUtil; import com.consum.base.pojo.LWhFormProcureGoodsInfoParam; import com.consum.base.pojo.LWhFormProcureParam; import com.consum.base.pojo.LWhProcureModelParam; import com.consum.base.pojo.excel.ProcureExcelTemplate; import com.consum.base.pojo.query.FormProcureQry; import com.consum.base.service.BaseGoodsTemplateService; import com.consum.base.service.BaseWarehouseService; import com.consum.base.service.LOrgSupplierServiceImpl; import com.consum.base.service.LWhFormProcureGoodsService; import com.consum.base.service.LWhFormProcureService; import com.consum.base.service.LWhGoodsService; import com.consum.base.service.LWhProcureModelService; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.FinSysTenantUser; import com.consum.model.po.LOrgSupplier; import com.consum.model.po.LWhFormProcure; import com.consum.model.po.LWhFormProcureGoods; import com.consum.model.po.LWhProcureModel; 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.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; /** * @ClassName lWhFormProcureService * @Date 2023/10/24 * @Description 采购单 * @Version 1.0 **/ @Service public class LWhFormProcureServiceImpl extends BaseServiceImpl implements LWhFormProcureService { @Autowired private BaseWarehouseService baseWarehouseService; @Resource private LOrgSupplierServiceImpl lOrgSupplierService; @Autowired private BaseGoodsTemplateService baseGoodsTemplateService; @Autowired private LWhGoodsService lWhGoodsService; @Autowired private LWhFormProcureGoodsService lWhFormProcureGoodsService; @Autowired private LWhProcureModelService lWhProcureModelService; @Autowired private CodeGeneratorService codeGeneratorService; private static String QUERY_FORM_PROCURE_LIST = "SELECT * FROM L_WH_FORM_PROCURE WHERE 1 = 1"; @Override public PageUtil queryFormProcureList(FormProcureQry param) { HashMap paramts = new HashMap<>(); StringBuilder sql = new StringBuilder(QUERY_FORM_PROCURE_LIST); // 入库单号 if (!StringUtils.isEmpty(param.getBusinessFormCode())) { sql.append(" and BUSINESS_FORM_CODE like :businessFormCode "); paramts.put("businessFormCode", StringUtils.CHAR_PERCENT + param.getBusinessFormCode() + StringUtils.CHAR_PERCENT); } if (param.getAgencyId() != null) { sql.append(" and AGENCY_ID like :agencyId "); paramts.put("agencyId", param.getAgencyId() + StringUtils.CHAR_PERCENT); } // 创建人 if (!StringUtils.isEmpty(param.getCreateName())) { sql.append(" and buyer_Name =:buyerName "); paramts.put("buyerName", param.getCreateName()); } // 状态 if (param.getStates() != null) { sql.append(" and states =:states "); paramts.put("states", param.getStates()); } // 入库时间 if (param.getStartTime() != null) { sql.append(" and INCOME_TIME >=:incomeTimeStart "); paramts.put("incomeTimeStart", param.getStartTime() * 1000000); } if (param.getEndTime() != null) { sql.append(" and INCOME_TIME <:incomeTimeEnd "); paramts.put("incomeTimeEnd", param.getEndTime() * 1000000 + 240000); } // 物品名称 if (!StringUtils.isEmpty(param.getGoodsTemplateName())) { sql.append( " AND id IN (SELECT BUSINESS_ID FROM L_WH_PROCURE_MODEL procureModel LEFT JOIN BASE_GOODS_MODELS baseModel ON procureModel.BASE_GOODS_MODELS_ID=baseModel.ID LEFT JOIN BASE_GOODS_TEMPLATE baseTemp ON baseModel.GOODS_TEMPLATES_ID=baseTemp.id WHERE procureModel.BUSINESS_TYPE=1 AND baseTemp.GOODS_NAME LIKE :goodsTemplateName)"); paramts.put("goodsTemplateName", StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT); } sql.append(" ORDER BY PROCURE_TIME DESC"); GenericPager genericPager = selectSplit(sql.toString(), paramts, new LWhFormProcure()); PageUtil pageUtil = new PageUtil(genericPager); return pageUtil; } @Override public GenericPager> queryFormProcureDetailList(FormProcureQry param) { HashMap paramts = new HashMap<>(); StringBuilder sql = new StringBuilder("SELECT pm.id,fp.BUSINESS_FORM_CODE,fpg.GOODS_TEMPLATE_NAME,pm.PRICE,pm.COUNTS, " + "( pm.PRICE * pm.COUNTS ) amount,fp.AGENCY_NAME,fp.BUYER_NAME,fp.PROCURE_TIME,pm.BUSINESS_ID,pm.BASE_GOODS_MODELS_NAME FROM l_wh_form_procure fp " + "LEFT JOIN l_wh_form_procure_goods fpg ON fp.id = fpg.WH_FORM_PROCURE_ID " + "LEFT JOIN l_wh_procure_model pm ON pm.FROM_PROCURE_GOODS_ID = fpg.id WHERE pm.BUSINESS_TYPE = 1 "); // 只查询本机构的采购单 if (param.getAgencyId() != null) { sql.append("and AGENCY_ID like :agencyId "); paramts.put("agencyId", param.getAgencyId() + StringUtils.CHAR_PERCENT); } // 入库单号 if (!StringUtils.isEmpty(param.getBusinessFormCode())) { sql.append("and BUSINESS_FORM_CODE = :businessFormCode "); paramts.put("businessFormCode", param.getBusinessFormCode()); } // 物品名称 if (!StringUtils.isEmpty(param.getGoodsTemplateName())) { sql.append("and fpg.GOODS_TEMPLATE_NAME like :goodsTemplateName "); paramts.put("goodsTemplateName", StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT); } if (param.getAgencyId() != null) { sql.append("and AGENCY_ID like :agencyId "); paramts.put("agencyId", param.getAgencyId() + StringUtils.CHAR_PERCENT); } // 创建人 if (!StringUtils.isEmpty(param.getCreateName())) { sql.append("and buyer_Name =:buyerName "); paramts.put("buyerName", param.getCreateName()); } // 入库开始时间 if (param.getStartTime() != null) { sql.append("and INCOME_TIME >=:incomeTimeStart "); paramts.put("incomeTimeStart", param.getStartTime() * 1000000); } // 入库结束时间 if (param.getEndTime() != null) { sql.append("and INCOME_TIME <:incomeTimeEnd "); paramts.put("incomeTimeEnd", param.getEndTime() * 1000000 + 240000); } // 规格型号 if (param.getBaseGoodsModelsId() != null) { sql.append("and pm.BASE_GOODS_MODELS_ID =:baseGoodsModelsId "); paramts.put("baseGoodsModelsId", param.getBaseGoodsModelsId()); } sql.append("ORDER BY PROCURE_TIME DESC"); GenericPager genericPager = selectSplit(sql.toString(), paramts, param.getPageNum(), param.getPageSize(), new MapperUtil()); return genericPager; } @Override public List getExportList(Long id) { String sql = "SELECT\n" + "\tfp.BUSINESS_FORM_CODE,\n" + "\tfp.AGENCY_NAME tenantName,\n" + "\tfp.INCOME_TIME createTime,\n" + "\tfp.INCOME_NAME operatorName,\n" + "\tGOODS_NAME templateName,\n" + "\tpm.BASE_GOODS_MODELS_NAME baseModelName,\n" + "\tcounts num,\n" + "\tprice,\n" + "\ttotal_amount totalAmount,\n" + "\tWAREHOUSE_NAME,\n" + "\tBEIZ remark\n" + "FROM\n" + "\tl_wh_procure_model pm\n" + "\tLEFT JOIN base_goods_models bgm ON pm.BASE_GOODS_MODELS_ID = bgm.id\n" + "\tLEFT JOIN base_goods_template bgt ON bgm.GOODS_TEMPLATES_ID = bgt.id\n" + "\tLEFT JOIN l_wh_form_procure fp ON fp.ID = pm.BUSINESS_ID\n" + "WHERE\n" + "\tpm.BUSINESS_ID = :id"; Map param = new HashMap<>(); param.put("id", id); List> select = this.select(sql, param, new MapperUtil()); if (CollectionUtils.isEmpty(select)) { return null; } List list = Lists.newArrayList(); select.forEach(item -> { ProcureExcelTemplate templateExcelExport = MapUtils.convertMapToObj(item, ProcureExcelTemplate.class); templateExcelExport.setAmount(CurrencyUtil.convertFenToYuan(templateExcelExport.getTotalAmount())); templateExcelExport.setPrice(CurrencyUtil.convertFenToYuan(templateExcelExport.getPrice())); list.add(templateExcelExport); }); return list; } @Override public void add(LWhFormProcureParam param, FinSysTenantUser sysTenantUser, S_user_core currentUser) { Long warehouseId = param.getWarehouseId(); BaseWarehouse baseWarehouse = baseWarehouseService.getById(warehouseId); String tenantId = sysTenantUser.getTenantId(); String tenantName = sysTenantUser.getTenantName(); // 采购单id Long whFormProcureId = param.getId(); if (whFormProcureId == null) { whFormProcureId = IdUtil.generateId(); } long procureTime = Long.valueOf(param.getProcureTime()); Set supplierList = new HashSet<>(); ArrayList procureGoodList = new ArrayList<>(); ArrayList procureModelList = new ArrayList<>(); List procureGoods = param.getProcureGoods(); for (int i = 0; i < procureGoods.size(); i++) { LWhFormProcureGoodsInfoParam procureGoodT = procureGoods.get(i); Long baseCategoryId = procureGoodT.getBaseCategoryId(); Long baseGoodsTemplateId = procureGoodT.getBaseGoodsTemplateId(); String supplier = procureGoodT.getSupplier(); // 判断当前供应商是否已存在 if (!supplierList.contains(supplier) && !lOrgSupplierService.supplierIsContain(tenantId, supplier)) { supplierList.add(supplier); } List models = procureGoodT.getModels(); if (CollectionUtils.isEmpty(models)) { throw new RuntimeException("采购单不能为空"); } LWhFormProcureGoods procureGood = new LWhFormProcureGoods(); long fromProcureGoodsId = IdUtil.generateId(); procureGood.setId(fromProcureGoodsId); procureGood.setWhFormProcureId(whFormProcureId); procureGood.setBaseCategoryId(baseCategoryId); procureGood.setBaseGoodsTemplateId(baseGoodsTemplateId); procureGood.setGoodsTemplateName(procureGoodT.getGoodsTemplateName()); procureGood.setSupplier(supplier); procureGood.setSort(i); for (LWhProcureModelParam modelT : models) { Integer counts = modelT.getCounts(); if (counts == null || counts <= 0) { throw new RuntimeException("型号的采购数量只能为正整数"); } Long price = modelT.getPrice(); if (price == null || price <= 0) { throw new RuntimeException("型号的采购价格只能为正数"); } Long baseGoodsModelsId = modelT.getBaseGoodsModelsId(); if (baseGoodsModelsId == null) { throw new RuntimeException("采购的价型号未找到"); } // 查询型号信息 Map tempGoodsInfo = baseGoodsTemplateService.queryGoodsInfoByModelId(baseGoodsModelsId); if (CollectionUtils.isEmpty(tempGoodsInfo)) { throw new RuntimeException("采购的价型号未找到"); } String modelName = (String)tempGoodsInfo.get("modelname"); // 查询型号库存 List warehouseIds = new ArrayList<>(Arrays.asList(warehouseId)); // 库存查询所有类型的包括机构和部门的类型 int goodsModelNum = lWhGoodsService.queryGoodsModelNum(null, warehouseIds, baseGoodsModelsId, 1, null); LWhProcureModel model = new LWhProcureModel(); model.setId(IdUtil.generateId()); model.setFromProcureGoodsId(fromProcureGoodsId); model.setBusinessType(WhBusinessEnum.CAIGOU.getValue()); model.setBusinessId(whFormProcureId); model.setBaseGoodsModelsId(baseGoodsModelsId); model.setBaseGoodsModelsName(modelName); model.setPrice(price); model.setCounts(counts); model.setWorehouseCount(goodsModelNum); model.setSupplier(supplier); model.setTotalAmount(price * counts); procureModelList.add(model); } procureGoodList.add(procureGood); } lWhFormProcureGoodsService.insertBatch(procureGoodList); lWhProcureModelService.insertBatch(procureModelList); LWhFormProcure lWhFormProcure = getlWhFormProcure(param, whFormProcureId, warehouseId, baseWarehouse, currentUser, procureTime); insert(lWhFormProcure); supplierList.forEach(supplier -> { LOrgSupplier lOrgSupplier = new LOrgSupplier(); lOrgSupplier.setId(IdUtil.generateId()); lOrgSupplier.setAgencyId(tenantId); lOrgSupplier.setAgencyName(tenantName); lOrgSupplier.setSupplier(supplier); lOrgSupplierService.insert(lOrgSupplier); }); } private LWhFormProcure getlWhFormProcure(LWhFormProcureParam param, Long whFormProcureId, Long warehouseId, BaseWarehouse baseWarehouse, S_user_core currentUser, long procureTime) { // 插入 采购单物品【L_WH_FORM_PROCURE_GOODS】 LWhFormProcure lWhFormProcure = new LWhFormProcure(); lWhFormProcure.setId(whFormProcureId); lWhFormProcure .setBusinessFormCode(codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Procure_Warehouse)); lWhFormProcure.setWarehouseId(warehouseId); lWhFormProcure.setWarehouseName(baseWarehouse.getWarehouseName()); lWhFormProcure.setBuyerId(currentUser.getId()); lWhFormProcure.setBuyerName(currentUser.getNick_name()); lWhFormProcure.setProcureTime(procureTime); lWhFormProcure.setProcureDoc(param.getProcureDoc()); lWhFormProcure.setBuyType(param.getBuyType()); lWhFormProcure.setStates(1); lWhFormProcure.setAgencyId(baseWarehouse.getAgencyId()); lWhFormProcure.setAgencyName(baseWarehouse.getAgencyName()); return lWhFormProcure; } }