diff --git a/main/java/shkd/repc/iwork/IWorkParticipantPlugin.java b/main/java/shkd/repc/iwork/IWorkParticipantPlugin.java index f23a682..bce4379 100644 --- a/main/java/shkd/repc/iwork/IWorkParticipantPlugin.java +++ b/main/java/shkd/repc/iwork/IWorkParticipantPlugin.java @@ -150,6 +150,7 @@ public class IWorkParticipantPlugin implements IWorkflowPlugin { } private void handlePayReqBill(DynamicObject entity, List currentApprover) { + //合同/费用登记 DynamicObject contractbill = entity.getDynamicObject("contractbill"); // 付款申请_获取选择的合同 if (contractbill != null) { contractbill = BusinessDataServiceHelper.loadSingle(contractbill.getPkValue(), "recon_contractbill"); @@ -157,8 +158,16 @@ public class IWorkParticipantPlugin implements IWorkflowPlugin { // if ("qeug_recon_developer".equals(partyatype1)) { DynamicObject dynamicObject = contractbill.getDynamicObject("multitypepartya"); // 甲方 addApprover(currentApprover, dynamicObject, "qeug_userfield", "园区会计"); + return; // } } + DynamicObject connotextbill = entity.getDynamicObject("connotextbill"); // 付款申请_获取选择的费用登记 + if (null != connotextbill) { + connotextbill = BusinessDataServiceHelper.loadSingle(connotextbill.getPkValue(), "recon_connotextbill"); + DynamicObject qeugJf = connotextbill.getDynamicObject("qeug_jf");//财务组织_甲方类型 + addApprover(currentApprover, qeugJf, "qeug_userfield", "园区会计"); + + } } public static void addApprover(List currentApprover, DynamicObject dynamicObject, String field, String role) { diff --git a/main/java/shkd/repc/rebm/formplugin/PurchaseMaterialImportPlugin.java b/main/java/shkd/repc/rebm/formplugin/PurchaseMaterialImportPlugin.java new file mode 100644 index 0000000..48eaa97 --- /dev/null +++ b/main/java/shkd/repc/rebm/formplugin/PurchaseMaterialImportPlugin.java @@ -0,0 +1,64 @@ +package shkd.repc.rebm.formplugin; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.metadata.IDataEntityType; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.datamodel.BasedataItem; +import kd.bos.entity.datamodel.events.QueryImportBasedataEventArgs; +import kd.bos.form.operate.webapi.RowMapper; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.sdk.plugin.Plugin; +import shkd.repc.recon.formplugin.dynamic.ImportMaterial; + +import java.util.*; + +/** + * 动态表单插件 + * 采购需求物料导入插件 + */ +public class PurchaseMaterialImportPlugin extends AbstractFormPlugin implements Plugin { + + + + private static final String BOS_ORG = "bos_org";//组织实体 + + private static final String BD_MATERIAL = "bd_material";//物料实体 + + private static final Set materialList=new HashSet<>(); + @Override + public void queryImportBasedata(QueryImportBasedataEventArgs e) { + super.queryImportBasedata(e); + DynamicObject targetObj = ((RowMapper) e.getSource()).getTargetObj(); + IDataEntityType dataEntityType = targetObj.getDataEntityType(); + if (null!=dataEntityType){ + String name = dataEntityType.getName(); + if (StringUtils.equals("qeug_cgxqentry",name)){ + Map> searchResult = e.getSearchResult(); + for (Map.Entry> entry : searchResult.entrySet()) { + List basedata = entry.getValue(); + // 查不到基础资料数据(导入基础资料类型会自动查找) + if (basedata.isEmpty()) { + String entityNumber = entry.getKey().getEntityNumber(); + //只针对物料 + if ("bd_material".equals(entityNumber)){ + Long materialId = newMaterial(entry.getKey().getSearchValue(),materialList); + basedata.add(materialId); + } + } else { + // 查到多个基础资料数据 + // 业务场景,应根据需求剔除不合法的基础资料数据(最终保留一个) + Iterator it = basedata.iterator(); + it.next(); + while (it.hasNext()) { + it.remove(); + } + } + } + } + } + } + + private Long newMaterial(String searchValue, Set materialList) { + return null; + } +} \ No newline at end of file diff --git a/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java b/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java index 3e4fdb9..28ef478 100644 --- a/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java +++ b/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java @@ -313,7 +313,12 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadList Row row = sheet.getRow(j); if (null != row) { //第一列断号 - String seq = row.getCell(0).toString(); + String seq = null; + try { + seq = row.getCell(0).toString(); + } catch (Exception e) { + continue; + } seq = seq.split("\\.")[0]; // 取第一个部分 if (StringUtils.isEmpty(seq)) { System.out.println("第 " + (j + 1) + " 行第一列是空值,跳过"); diff --git a/main/java/shkd/repc/recon/formplugin/ContractMaterialImportPlugin.java b/main/java/shkd/repc/recon/formplugin/ContractMaterialImportPlugin.java index 2f08e11..17bc0d0 100644 --- a/main/java/shkd/repc/recon/formplugin/ContractMaterialImportPlugin.java +++ b/main/java/shkd/repc/recon/formplugin/ContractMaterialImportPlugin.java @@ -123,7 +123,7 @@ public class ContractMaterialImportPlugin extends AbstractFormPlugin { this.getView().showMessage(e.getMessage()); } return id; - } +} private String checkMaterial(String materialName, String materialModel) { QFilter qFilter = new QFilter("name", QCP.equals, materialName); diff --git a/main/java/shkd/repc/recon/formplugin/ContractProjectFormPlugin.java b/main/java/shkd/repc/recon/formplugin/ContractProjectFormPlugin.java index f94666c..14aad12 100644 --- a/main/java/shkd/repc/recon/formplugin/ContractProjectFormPlugin.java +++ b/main/java/shkd/repc/recon/formplugin/ContractProjectFormPlugin.java @@ -102,33 +102,37 @@ public class ContractProjectFormPlugin extends AbstractBillPlugIn { } private void setRenovationProjectByOrg(DynamicObject org) { - // 采购项目 - DynamicObject[] projectbills = BusinessDataServiceHelper.load("rebm_purproject", "id", - new QFilter[]{new QFilter("org.id", QCP.equals, org.getPkValue())}); + try { + // 采购项目 + DynamicObject[] projectbills = BusinessDataServiceHelper.load("rebm_purproject", "id", + new QFilter[]{new QFilter("org.id", QCP.equals, org.getPkValue())}); - DynamicObject projectbill = null; + DynamicObject projectbill = null; - if (projectbills.length > 0) { - DynamicObject projectbill1 = projectbills[0]; - if (projectbill1 != null) { - //项目建立F7 + if (projectbills.length > 0) { + DynamicObject projectbill1 = projectbills[0]; + if (projectbill1 != null) { + //项目建立F7 + DynamicObject add = BusinessDataServiceHelper.loadSingle("repmd_project_f7", + new QFilter[]{new QFilter("number", QCP.equals, projectbill1.getString("number"))}); + if (add != null) { + projectbill = add; + } + } + } else { DynamicObject add = BusinessDataServiceHelper.loadSingle("repmd_project_f7", - new QFilter[]{new QFilter("number", QCP.equals, projectbill1.getString("number"))}); + new QFilter[]{new QFilter("number", QCP.equals, "XM-202412-008")}); if (add != null) { projectbill = add; } } - } else { - DynamicObject add = BusinessDataServiceHelper.loadSingle("repmd_project_f7", - new QFilter[]{new QFilter("number", QCP.equals, "XM-202412-008")}); - if (add != null) { - projectbill = add; - } - } - // 设置项目并更新视图 - this.getModel().setValue("project", projectbill); - this.getView().updateView("project"); + // 设置项目并更新视图 + this.getModel().setValue("project", projectbill); + this.getView().updateView("project"); + }catch (Exception e){ + + } } } diff --git a/main/java/shkd/repc/recon/formplugin/MaterialSaveCarryNumberPlugin.java b/main/java/shkd/repc/recon/formplugin/MaterialSaveCarryNumberPlugin.java new file mode 100644 index 0000000..11b9381 --- /dev/null +++ b/main/java/shkd/repc/recon/formplugin/MaterialSaveCarryNumberPlugin.java @@ -0,0 +1,269 @@ +package shkd.repc.recon.formplugin; + +import kd.bos.bill.AbstractBillPlugIn; +import kd.bos.coderule.api.CodeRuleInfo; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.datamodel.IBillModel; +import kd.bos.entity.datamodel.IDataModel; +import kd.bos.form.control.events.BeforeItemClickEvent; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.bos.servicehelper.org.OrgUnitServiceHelper; +import kd.sdk.plugin.Plugin; + +import java.util.EventObject; + +/** + * 动态表单插件 + * 带出物料编码 + */ +public class MaterialSaveCarryNumberPlugin extends AbstractBillPlugIn implements Plugin { + + private static final String BOS_ORG = "bos_org";//组织实体 + + private static final String BD_MATERIAL = "bd_material";//物料实体 + + @Override + public void registerListener(EventObject e) { + super.registerListener(e); + this.addItemClickListeners("tbmain"); + } + + @Override + public void beforeItemClick(BeforeItemClickEvent evt) { + super.beforeItemClick(evt); + String key = evt.getItemKey().toLowerCase(); + String name = this.getModel().getDataEntityType().getName(); + //合同非定额物料保存 + if ("bar_save".equals(key)&&"recon_contractbill".equals(name)) { + this.carryMaterialNumber("qeug_orderformentry","qeug_material"); + + } + //采购订单保存 + else if ("save".equals(key)&&"repe_orderform".equals(name)){ + this.carryMaterialNumber("orderformentry","material"); + } + //采购需求保存 + else if ("qeug_baritemap".equals(key)&&"recon_settleplanbill".equals(name)){ + this.carryMaterialNumber("qeug_cgxqentry","qeug_materialmasterid"); + } + } + + /** + * 携带物料编码 + * @param entryLogotype 分录标识 + * @param materialLogotype 物料字段标识 + */ + private void carryMaterialNumber(String entryLogotype,String materialLogotype) { + DynamicObjectCollection entryEntity = this.getModel().getEntryEntity(entryLogotype); + if (entryEntity != null && entryEntity.size() != 0) { + for (int i = 0; i < entryEntity.size(); i++) { + DynamicObject material = entryEntity.get(i).getDynamicObject(materialLogotype);//物料-基础资料 + String type = entryEntity.get(i).getString("qeug_importmaterialtype");//物料分类 + String model = entryEntity.get(i).getString("qeug_importmodel");//规格型号 + String unit = entryEntity.get(i).getString("qeug_importunit");//规格型号 + String brand = entryEntity.get(i).getString("qeug_brand");//规格型号 + String extModel = entryEntity.get(i).getString("qeug_model");//规格型号 + Long id; + if (material==null){ + String name = entryEntity.get(i).getString("qeug_materialnames"); + if (name!=null&&!"".equals(name)){ + //查询系统已有编码 + id = this.getExitMaterialId(name,model); + if (id==null){ + //新增物料 + id=this.addNewMaterial(name,type,model,unit,brand,extModel); + } + this.getModel().setValue(materialLogotype,id,i); + } + } + } + } + } + + + /** + * 查询系统中有的物料id + * @param materialName 名称 + * @param materialModel 规格类型 + * @return + */ + private Long getExitMaterialId(String materialName, String materialModel) { + QFilter qFilter = new QFilter("name", QCP.equals, materialName); + qFilter.and("modelnum",QCP.equals,materialModel); + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("bd_material", qFilter.toArray()); + if (dynamicObject!=null){ + return dynamicObject.getLong("id"); + } + return null; + } + + /** + * 新增物料-带出id + * @param name 名称 + * @param type 分类 + * @param model 规格型号 + * @param unit 单位 + * @param brand 品牌 + * @param extModel 型号 + * @return + */ + private Long addNewMaterial(String name, String type, String model, String unit, String brand, String extModel) { + DynamicObject bd_material; + Long id = null; + try { + bd_material = BusinessDataServiceHelper.newDynamicObject(BD_MATERIAL); + //物料编码 + DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject("bd_material"); + CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(dynamicObject.getDataEntityType().getName(), + dynamicObject, null); + bd_material.set("number", CodeRuleServiceHelper.getNumber(codeRule, dynamicObject)); + //物料名称 + bd_material.set("name", name); + //所属组织 + long rootOrgId = OrgUnitServiceHelper.getRootOrgId(); + DynamicObject org = BusinessDataServiceHelper.loadSingle(rootOrgId, BOS_ORG); + if (null != org) { + bd_material.set("createorg", org); + } + //物料单位 + QFilter unitQFilter = new QFilter("name", QCP.equals, unit); + DynamicObject measureUnits = BusinessDataServiceHelper.loadSingle("bd_measureunits", unitQFilter.toArray()); + if (null != measureUnits) { + bd_material.set("baseunit", measureUnits); + } + bd_material.set("modelnum", model);//规格 + bd_material.set("materialtype", "1");//物料类型:物资 + //业务属性 + DynamicObjectCollection collection = bd_material.getDynamicObjectCollection("serviceattribute"); + DynamicObject serviceAttribute = BusinessDataServiceHelper.loadSingle("bd_serviceattribute", (new QFilter("number", QCP.equals, "1001")).toArray()); + if (serviceAttribute!=null){ + DynamicObject dynamicObject1 = new DynamicObject(collection.getDynamicObjectType()); + dynamicObject1.set("fbasedataId",serviceAttribute); + collection.add(dynamicObject1); + } + bd_material.set("qeug_brand",brand);//品牌 + bd_material.set("qeug_model",extModel);//型号 + bd_material.set("enable", "1");//使用状态:可用 + bd_material.set("status", "C");//数据状态:审核 + bd_material.set("ctrlstrategy", "5");//控制策略:全局共享 + bd_material.set("enablepur",true);//可采购 + bd_material.set("enablesale",true);//可销售 + bd_material.set("enableinv",true);//可库存 + + SaveServiceHelper.save(new DynamicObject[]{bd_material}); + //物料分类映射 + DynamicObject group = BusinessDataServiceHelper.loadSingle("bd_materialgroup", (new QFilter("name", QCP.equals, type)).toArray()); + if (group==null) { + //待分类 + group = BusinessDataServiceHelper.loadSingle("bd_materialgroup", (new QFilter("number", QCP.equals, "waitgroup")).toArray()); + } + id = bd_material.getLong("id"); + this.newMaterialType(id,group); + } catch (Exception e) { + this.getView().showMessage(e.getMessage()); + } + return id; + } + + /** + * 新增物料分类映射表数据 + * @param materialId + * @param group + */ + private void newMaterialType(Long materialId, DynamicObject group) { + DynamicObject materialType = BusinessDataServiceHelper.newDynamicObject("bd_materialgroupdetail"); + //分类标准 + DynamicObject standard = BusinessDataServiceHelper.loadSingle("bd_materialgroupstandard", (new QFilter("number", QCP.equals, "JBFLBZ")).toArray()); + materialType.set("standard",standard); + materialType.set("group",group); + //物料 + materialType.set("material",materialId); + SaveServiceHelper.save(new DynamicObject[]{materialType}); + } + + /** + * 编码存在,但是二开属性为空的字段自动带出数据 + * @param e + */ + @Override + public void afterLoadData(EventObject e) { + super.afterLoadData(e); + IBillModel model = (IBillModel) this.getModel(); + Object pkValue = model.getPKValue(); + String name = this.getModel().getDataEntityType().getName(); + if ("recon_contractbill".equals(name)){ + this.carryMaterialAttribute(pkValue,name,"qeug_orderformentry","qeug_material","qeug_materialnames"); + }else if ("repe_orderform".equals(name)){ + this.carryMaterialAttribute(pkValue,name,"orderformentry","material","qeug_materialnames"); + } + } + + private void carryMaterialAttribute(Object pkValue,String name,String entryLogotype,String materialLogotype,String materialNameLgt){ + + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, name); + if (dynamicObject!=null){ + DynamicObjectCollection collection = dynamicObject.getDynamicObjectCollection(entryLogotype); + if (collection!=null&&collection.size()!=0){ + for (DynamicObject entry : collection) { + DynamicObject material = entry.getDynamicObject(materialLogotype); + if (material!=null){ + DynamicObject queryMaterial = BusinessDataServiceHelper.loadSingle(material.getPkValue(), "bd_material"); + if (queryMaterial!=null){ + //物料名称 + String materialName = entry.getString(materialNameLgt); + if (StringUtils.isEmpty(materialName)){ + String queryName = queryMaterial.getString("name"); + if (StringUtils.isNotEmpty(queryName)){ + entry.set(materialNameLgt,queryName); + } + } + //物料分类 + String materialType = entry.getString("qeug_importmaterialtype"); + if (StringUtils.isEmpty(materialType)){ + String queryType = queryMaterial.getString("group.name"); + if (StringUtils.isNotEmpty(queryType)){ + entry.set("qeug_importmaterialtype",queryType); } + } + //物料规格 + String materialModel = entry.getString("qeug_importmodel"); + if (StringUtils.isEmpty(materialModel)){ + String queryModel = queryMaterial.getString("modelnum"); + if (StringUtils.isNotEmpty(queryModel)){ + entry.set("qeug_importmodel",queryModel); } + } + //物料单位 + String materialUnit= entry.getString("qeug_importunit"); + if (StringUtils.isEmpty(materialUnit)){ + String queryUnit = queryMaterial.getString("baseunit.name"); + if (StringUtils.isNotEmpty(queryUnit)){ + entry.set("qeug_importunit",queryUnit); } + } + + //物料品牌 + String materialBrand= entry.getString("qeug_brand"); + if (StringUtils.isEmpty(materialBrand)){ + String queryBrand = queryMaterial.getString("qeug_brand"); + if (StringUtils.isNotEmpty(queryBrand)){ + entry.set("qeug_brand",queryBrand); } + } + //物料型号 + String materialExtModel= entry.getString("qeug_model"); + if (StringUtils.isEmpty(materialExtModel)){ + String queryExtModel = queryMaterial.getString("qeug_model"); + if (StringUtils.isNotEmpty(queryExtModel)){ + entry.set("qeug_model",queryExtModel); } + } + } + } + } + } + } + SaveServiceHelper.update(dynamicObject); + } +} \ No newline at end of file diff --git a/main/java/shkd/repc/recon/opplugin/ContractOPPlugin.java b/main/java/shkd/repc/recon/opplugin/ContractOPPlugin.java index 32fc9b9..b89febe 100644 --- a/main/java/shkd/repc/recon/opplugin/ContractOPPlugin.java +++ b/main/java/shkd/repc/recon/opplugin/ContractOPPlugin.java @@ -49,28 +49,37 @@ public class ContractOPPlugin extends AbstractOperationServicePlugIn { } //合同清单(定额) DynamicObjectCollection invoiceentryinfos; + BigDecimal qeug_amounts = BigDecimal.ZERO;//金额(元)_合计 + //合同清单(定额) + DynamicObjectCollection orderformentry; + BigDecimal qeug_taxtotalprices = BigDecimal.ZERO;//金额(元)_合计 + boolean isEntry = false; try { //合同监控列表点击提交会提示找不到:qeug_invoiceentryinfo属性 invoiceentryinfos = dataEntity.getDynamicObjectCollection("qeug_invoiceentryinfo"); - if (!invoiceentryinfos.isEmpty()) { - for (DynamicObject invoiceentryinfo : invoiceentryinfos) { - BigDecimal qeug_amount = invoiceentryinfo.getBigDecimal("qeug_amount"); - } - } + //合同监控列表点击提交会提示找不到:qeug_orderformentry属性 + orderformentry = dataEntity.getDynamicObjectCollection("qeug_orderformentry"); }catch (Exception e){ dataEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(),"recon_contractbill"); invoiceentryinfos = dataEntity.getDynamicObjectCollection("qeug_invoiceentryinfo"); + orderformentry = dataEntity.getDynamicObjectCollection("qeug_orderformentry"); } - BigDecimal qeug_amounts = BigDecimal.ZERO;//金额(元)_合计 if (!invoiceentryinfos.isEmpty()) { + isEntry = true; for (DynamicObject invoiceentryinfo : invoiceentryinfos) { qeug_amounts = qeug_amounts.add(invoiceentryinfo.getBigDecimal("qeug_amount")); } } + if (!orderformentry.isEmpty()) { + isEntry = true; + for (DynamicObject orderform : orderformentry) { + qeug_taxtotalprices = qeug_taxtotalprices.add(orderform.getBigDecimal("qeug_taxtotalprice")); + } + } BigDecimal amount = dataEntity.getBigDecimal("amount");//合同金额 // 检查 qeug_amounts 是否大于 amount - if (qeug_amounts.setScale(2, RoundingMode.HALF_UP).compareTo(amount) > 0) { - this.addErrorMessage(extendedDataEntity, "合同清单(定额)的金额之和不能大于合同金额"); + if (isEntry&&qeug_amounts.add(qeug_taxtotalprices).setScale(2, RoundingMode.HALF_UP).compareTo(amount) < 0) { + this.addErrorMessage(extendedDataEntity, "合同清单(定额)与(非定额)的金额之和不能小于合同金额"); } // DynamicObjectCollection qeug_orderformentry1 = dataEntity.getDynamicObjectCollection("qeug_orderformentry"); // int qeug_orderformentry = qeug_orderformentry1==null?0:qeug_orderformentry1.size(); diff --git a/main/java/shkd/repc/repe/formplugin/OrderFormMaterialExportPlugin.java b/main/java/shkd/repc/repe/formplugin/OrderFormMaterialExportPlugin.java new file mode 100644 index 0000000..a01ddcb --- /dev/null +++ b/main/java/shkd/repc/repe/formplugin/OrderFormMaterialExportPlugin.java @@ -0,0 +1,254 @@ +package shkd.repc.repe.formplugin; + +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.fileservice.FileItem; +import kd.bos.fileservice.FileService; +import kd.bos.fileservice.FileServiceFactory; +import kd.bos.form.control.events.ItemClickEvent; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.sdk.plugin.Plugin; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.xssf.usermodel.*; + +import java.awt.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.EventObject; +import java.util.List; + +/** + * 动态表单插件 + */ +public class OrderFormMaterialExportPlugin extends AbstractFormPlugin implements Plugin { + + + @Override + public void registerListener(EventObject e) { + super.registerListener(e); + //工具栏控件 + this.addItemClickListeners("advcontoolbarap2"); + } + + @Override + public void itemClick(ItemClickEvent evt) { + super.itemClick(evt); + //工具栏控件里的工具栏项-导出 + if (StringUtils.equals("qeug_exportdata", evt.getItemKey())) { + Long value = (Long) this.getModel().getValue("id"); + if (value.compareTo(0L)==0){ + this.getView().showMessage("请先保存单据"); + return; + } + DynamicObject contract = BusinessDataServiceHelper.loadSingle(value, "repe_orderform"); + if (null!=contract){ + DynamicObjectCollection orderFormEntry = contract.getDynamicObjectCollection("orderformentry"); + if (orderFormEntry==null||orderFormEntry.size()==0){ + this.getView().showMessage("请填入数据保存后导出!"); + return; + } + //根据导入模板配置导出数据 + QFilter number = new QFilter("number", QCP.equals, "repe_orderform_IMPT_ENTRY"); + DynamicObject template = BusinessDataServiceHelper.loadSingle("bos_importentry_template", number.toArray()); + if (null==template){ + this.getView().showMessage("请先维护引入模板"); + return; + } + //表头字段 + List list =new ArrayList<>(); + DynamicObjectCollection entry = template.getDynamicObjectCollection("treeentryentity"); + if (null!=entry&&entry.size()!=0){ + for (int i = 0; i < entry.size(); i++) { + DynamicObject dynamicObject = entry.get(i); + if (dynamicObject.getBoolean("isimport")){ + list.add(dynamicObject); + } + } + } + if (list.size()==0) return; + //构建导出前四行数据 + + // 创建Excel工作簿 + XSSFWorkbook workbook = new XSSFWorkbook(); + XSSFSheet sheet = workbook.createSheet("明细 # orderformentry"); + + // 第一行:明细标题 + XSSFRow row1 = sheet.createRow(0); + XSSFCell cell1 = row1.createCell(0); + cell1.setCellValue("明细 # orderformentry"); + XSSFCellStyle style1 = workbook.createCellStyle(); + XSSFFont font1 = workbook.createFont(); + font1.setFontName("宋体"); + font1.setFontHeightInPoints((short) 11); + style1.setFont(font1); + style1.setAlignment(HorizontalAlignment.CENTER); + style1.setVerticalAlignment(VerticalAlignment.CENTER); + sheet.setColumnWidth(0, 31 * 256); // 设置列宽 + row1.setHeightInPoints(14.4f); + cell1.setCellStyle(style1); + + // 第二行:说明文本 + XSSFRow row2 = sheet.createRow(1); + XSSFCell cell2 = row2.createCell(0); + cell2.setCellValue("1、请将鼠标移到灰色标题行查看字段录入要求。2、红色带星号(*)的字段为必录字段。"); + XSSFCellStyle style2 = workbook.createCellStyle(); + XSSFFont font2 = workbook.createFont(); + font2.setFontName("Calibri"); + font2.setFontHeightInPoints((short) 11); + style2.setFont(font2); + style2.setAlignment(HorizontalAlignment.LEFT); + style2.setVerticalAlignment(VerticalAlignment.CENTER); + style2.setWrapText(true); // 自动换行 + row2.setHeightInPoints(60); + sheet.setColumnWidth(0, 31 * 256); // 设置列宽 + cell2.setCellStyle(style2); + + // 第三行:list中的entitynumber + XSSFRow row3 = sheet.createRow(2); + for (int i = 0; i < list.size(); i++) { + DynamicObject dynamicObject = list.get(i); + String entityNumber=null; + String importProp = dynamicObject.getString("importprop"); + if (!("").equals(importProp)){ + entityNumber = dynamicObject.getString("entitynumber")+"."+dynamicObject.getString("importprop"); + }else { + entityNumber = dynamicObject.getString("entitynumber"); + } + + XSSFCell cell = row3.createCell(i); + cell.setCellValue(entityNumber); + XSSFCellStyle style3 = workbook.createCellStyle(); + XSSFFont font3 = workbook.createFont(); + font3.setFontName("宋体"); + font3.setFontHeightInPoints((short) 11); + style3.setFont(font3); + style3.setAlignment(HorizontalAlignment.CENTER); + style3.setVerticalAlignment(VerticalAlignment.CENTER); + sheet.setColumnWidth(i, 31 * 256); // 设置列宽 + row3.setHeightInPoints(14.4f); + cell.setCellStyle(style3); + } + + // 第四行:list中的entityname + XSSFRow row4 = sheet.createRow(3); + for (int i = 0; i < list.size(); i++) { + DynamicObject dynamicObject = list.get(i); + String entityName = dynamicObject.getString("entitydescription"); + XSSFCell cell = row4.createCell(i); + cell.setCellValue(entityName); + XSSFCellStyle style4 = workbook.createCellStyle(); + XSSFFont font4 = workbook.createFont(); + font4.setFontName("Calibri"); + font4.setFontHeightInPoints((short) 11); + font4.setColor(IndexedColors.RED.getIndex()); + style4.setFont(font4); + style4.setAlignment(HorizontalAlignment.CENTER); + style4.setVerticalAlignment(VerticalAlignment.CENTER); + style4.setFillForegroundColor(new XSSFColor(new Color(192, 192, 192), new DefaultIndexedColorMap())); // 灰色背景 + style4.setFillPattern(FillPatternType.SOLID_FOREGROUND); + sheet.setColumnWidth(i, 31 * 256); // 设置列宽 + row4.setHeightInPoints(14.4f); + cell.setCellStyle(style4); + } + + // 填充数据行(根据entitynumber匹配) + for (int i = 0; i < orderFormEntry.size(); i++) { + DynamicObject orderEntry = orderFormEntry.get(i); + + // 创建数据行 + XSSFRow dataRow = sheet.createRow(i + 4); // 从第5行开始填充数据 + int colIndex = 0; + + for (int j = 0; j < list.size(); j++) { + DynamicObject dynamicObject = list.get(j); + String entityNumber=null; + String importProp = dynamicObject.getString("importprop"); + if (!("").equals(importProp)){ + entityNumber = dynamicObject.getString("entitynumber")+"."+dynamicObject.getString("importprop"); + }else { + entityNumber = dynamicObject.getString("entitynumber"); + } + // 获取对应的数据 + String data = orderEntry.getString(entityNumber); + if (data==null||"".equals(data)){ + switch (entityNumber){ + case "material.number": + continue; + case "qeug_importmaterialtype": + data=orderEntry.getString("material.group.name"); + break; + case "qeug_importmodel": + data=orderEntry.getString("material.modelnum"); + break; + case "qeug_importunit": + data=orderEntry.getString("material.baseunit.name"); + break; + default: + break; + } + } + + // 填充单元格 + XSSFCell cell = dataRow.createCell(colIndex++); + cell.setCellValue(data != null ? data : ""); + XSSFCellStyle dataStyle = workbook.createCellStyle(); + XSSFFont dataFont = workbook.createFont(); + dataFont.setFontName("宋体"); + dataFont.setFontHeightInPoints((short) 11); + dataStyle.setFont(dataFont); + dataStyle.setAlignment(HorizontalAlignment.CENTER); + dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); + dataRow.setHeightInPoints(14.4f); + cell.setCellStyle(dataStyle); + } + } + + // 上传Excel文件并获取下载路径 + String uploadedFilePath = uploadExcel(workbook); + String downloadUrl = RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + uploadedFilePath; + this.getView().openUrl(downloadUrl); + } + } + } + /** + * 上传Excel文件并返回路径 + */ + private String uploadExcel(XSSFWorkbook workbook) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); + String fileName = "导出数据_" + sdf.format(new Date()) + ".xlsx"; + String pathName = "/offices/" + fileName; + try { + OutputStream outputStream = new ByteArrayOutputStream(); + workbook.write(outputStream); + InputStream inputStream = parse(outputStream); + + FileService fs = FileServiceFactory.getAttachmentFileService(); + return fs.upload(new FileItem(fileName, pathName, inputStream)); + } catch (Exception e) { + //logger.error("上传Excel失败", e); + throw new RuntimeException("上传Excel失败", e); + } + } + + /** + * 解析输出流为输入流 + */ + public ByteArrayInputStream parse(final OutputStream out) throws Exception { + ByteArrayOutputStream outputStream = (ByteArrayOutputStream) out; + return new ByteArrayInputStream(outputStream.toByteArray()); + } + +} \ No newline at end of file diff --git a/main/java/shkd/repc/repe/formplugin/OrderFormMaterialImportPlugin.java b/main/java/shkd/repc/repe/formplugin/OrderFormMaterialImportPlugin.java new file mode 100644 index 0000000..7896501 --- /dev/null +++ b/main/java/shkd/repc/repe/formplugin/OrderFormMaterialImportPlugin.java @@ -0,0 +1,301 @@ +package shkd.repc.repe.formplugin; + +import com.alibaba.dubbo.common.utils.CollectionUtils; +import com.alibaba.fastjson.JSONObject; +import kd.bos.coderule.api.CodeRuleInfo; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.metadata.IDataEntityType; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.datamodel.BasedataItem; +import kd.bos.entity.datamodel.events.BeforeImportEntryEventArgs; +import kd.bos.entity.datamodel.events.QueryImportBasedataEventArgs; +import kd.bos.entity.plugin.ImportLogger; +import kd.bos.form.operate.webapi.RowMapper; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.bos.form.plugin.importentry.resolving.ImportEntryData; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.bos.servicehelper.org.OrgUnitServiceHelper; +import kd.sdk.plugin.Plugin; +import shkd.repc.recon.formplugin.dynamic.ImportMaterial; + +import java.util.*; + +/** + * 动态表单插件 + * 采购订单-订单明细导入插件 + */ +public class OrderFormMaterialImportPlugin extends AbstractFormPlugin implements Plugin { + + + private static final String BOS_ORG = "bos_org";//组织实体 + + private static final String BD_MATERIAL = "bd_material";//物料实体 + + private static final Set materialList=new HashSet<>(); + //TODO: 生成物料逻辑迁移到导入过程中,获取excel行 + @Override + public void queryImportBasedata(QueryImportBasedataEventArgs e) { + super.queryImportBasedata(e); + DynamicObject targetObj = ((RowMapper) e.getSource()).getTargetObj(); + IDataEntityType dataEntityType = targetObj.getDataEntityType(); + if (null!=dataEntityType){ + String name = dataEntityType.getName(); + if (StringUtils.equals("orderformentry",name)){ + Map> searchResult = e.getSearchResult(); + for (Map.Entry> entry : searchResult.entrySet()) { + List basedata = entry.getValue(); + // 查不到基础资料数据(导入基础资料类型会自动查找) + if (basedata.isEmpty()) { + String entityNumber = entry.getKey().getEntityNumber(); + //只针对物料 + if ("bd_material".equals(entityNumber)){ + Long materialId = newMaterial(entry.getKey().getSearchValue(),materialList); + basedata.add(materialId); + } + } else { + // 查到多个基础资料数据 + // 业务场景,应根据需求剔除不合法的基础资料数据(最终保留一个) + Iterator it = basedata.iterator(); + it.next(); + while (it.hasNext()) { + it.remove(); + } + } + } + } + } + } + private Long newMaterial(String number,Set set){ + DynamicObject bd_material; + Long id = null; + try { + ImportMaterial materialByNumber = getMaterialByNumber(number, set); + bd_material = BusinessDataServiceHelper.newDynamicObject(BD_MATERIAL); + //物料编码 + bd_material.set("number", number); + //物料名称 + bd_material.set("name", materialByNumber.getMaterialName()); + //所属组织 + long rootOrgId = OrgUnitServiceHelper.getRootOrgId(); + DynamicObject org = BusinessDataServiceHelper.loadSingle(rootOrgId, BOS_ORG); + if (null != org) { + bd_material.set("createorg", org); + } + //物料单位 + QFilter unit = new QFilter("name", QCP.equals, materialByNumber.getMaterialUnit()); + DynamicObject measureUnits = BusinessDataServiceHelper.loadSingle("bd_measureunits", unit.toArray()); + if (null != measureUnits) { + bd_material.set("baseunit", measureUnits); + } + bd_material.set("modelnum", materialByNumber.getMaterialModel());//规格 + bd_material.set("materialtype", "1");//物料类型:物资 + //业务属性 + DynamicObjectCollection collection = bd_material.getDynamicObjectCollection("serviceattribute"); + DynamicObject serviceAttribute = BusinessDataServiceHelper.loadSingle("bd_serviceattribute", (new QFilter("number", QCP.equals, "1001")).toArray()); + if (serviceAttribute!=null){ + DynamicObject dynamicObject = new DynamicObject(collection.getDynamicObjectType()); + dynamicObject.set("fbasedataId",serviceAttribute); + collection.add(dynamicObject); + } + bd_material.set("qeug_brand",materialByNumber.getMaterialBrand());//品牌 + bd_material.set("qeug_model",materialByNumber.getMaterialExtModel());//型号 + bd_material.set("enable", "1");//使用状态:可用 + bd_material.set("status", "C");//数据状态:审核 + bd_material.set("ctrlstrategy", "5");//控制策略:全局共享 + bd_material.set("enablepur",true);//可采购 + bd_material.set("enablesale",true);//可销售 + bd_material.set("enableinv",true);//可库存 + + SaveServiceHelper.save(new DynamicObject[]{bd_material}); + //物料分类映射 + DynamicObject group = BusinessDataServiceHelper.loadSingle("bd_materialgroup", (new QFilter("name", QCP.equals, materialByNumber.getMaterialType())).toArray()); + if (group==null) { + //待分类 + group = BusinessDataServiceHelper.loadSingle("bd_materialgroup", (new QFilter("number", QCP.equals, "waitgroup")).toArray()); + } + id = bd_material.getLong("id"); + this.newMaterialType(id,group); + } catch (Exception e) { + this.getView().showMessage(e.getMessage()); + } + return id; + } + + private String checkMaterial(String materialName, String materialModel) { + QFilter qFilter = new QFilter("name", QCP.equals, materialName); + qFilter.and("modelnum",QCP.equals,materialModel); + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("bd_material", qFilter.toArray()); + if (dynamicObject!=null){ + return dynamicObject.getString("number"); + } + return null; + } + + private void newMaterialType(Long materialId,DynamicObject group){ + DynamicObject materialType = BusinessDataServiceHelper.newDynamicObject("bd_materialgroupdetail"); + //分类标准 + DynamicObject standard = BusinessDataServiceHelper.loadSingle("bd_materialgroupstandard", (new QFilter("number", QCP.equals, "JBFLBZ")).toArray()); + materialType.set("standard",standard); + materialType.set("group",group); + //物料 + materialType.set("material",materialId); + SaveServiceHelper.save(new DynamicObject[]{materialType}); + } + + @Override + public void beforeImportEntry(BeforeImportEntryEventArgs e) { + super.beforeImportEntry(e); + try { + // 提前加载所有物料类型 + Set validMaterialTypes = new HashSet<>(); + DynamicObject[] typeList = BusinessDataServiceHelper.load("bd_materialgroup", "id,name", null); + for (DynamicObject obj : typeList) { + validMaterialTypes.add(obj.getString("name")); + } + + materialList.clear(); + Set existCodes = new HashSet<>(); + + // 获取已存在的物料编码 + DynamicObjectCollection orderFormEntry = (DynamicObjectCollection) this.getModel().getValue("orderformentry"); + if (orderFormEntry != null && !orderFormEntry.isEmpty()) { + for (DynamicObject dynamicObject : orderFormEntry) { + String number = dynamicObject.getString("material.number"); + existCodes.add(number); + } + } + + // 处理导入数据 + HashMap itemEntry = (HashMap) e.getSource(); + ArrayList list = (ArrayList) itemEntry.get("orderformentry"); + + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + ImportEntryData importData = (ImportEntryData) iterator.next(); + JSONObject data = importData.getData(); + Map map = data.toJavaObject(Map.class); + JSONObject material = (JSONObject) map.get("material");//物料编码 + String number=null; + ImportMaterial importMaterial = new ImportMaterial(); + + // 如果 material 为空 + if (material == null) { + //TODO:判断物料是否已在系统 + number= this.checkMaterial((String) map.get("qeug_materialnames"),(String) map.get("qeug_importmodel")); + if (number==null){ + DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject("bd_material"); + CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(dynamicObject.getDataEntityType().getName(), + dynamicObject, null); + number = CodeRuleServiceHelper.getNumber(codeRule, dynamicObject); + } + // 构造一个新的 JSONObject 来保存生成的物料编码 + JSONObject materialJson = new JSONObject(); + materialJson.put("importprop","number"); + materialJson.put("number", number); + map.put("material", materialJson); // 注意这里要传递完整对象 + importMaterial.setMaterialNumber(number); + }else { + importMaterial.setMaterialNumber(material.getString("number")); + } + //物料类型校验 + String impMaterialType = (String) map.get("qeug_importmaterialtype"); + if (!validMaterialTypes.contains(impMaterialType)) { + map.replace("qeug_importmaterialtype", "待分类"); + } + importMaterial.setMaterialName((String) map.get("qeug_materialnames")); + importMaterial.setMaterialType((String) map.get("qeug_importmaterialtype")); + importMaterial.setMaterialModel((String) map.get("qeug_importmodel")); + importMaterial.setMaterialUnit((String) map.get("qeug_importunit")); + importMaterial.setMaterialBrand((String) map.get("qeug_brand")); + importMaterial.setMaterialExtModel((String) map.get("qeug_model")); + materialList.add(importMaterial); + } + + // 校验数据 + Set>> entries = itemEntry.entrySet(); + for (Map.Entry> entry : entries) { + String entryName = entry.getKey(); + List entryEntityImportDataList = entry.getValue(); + if (CollectionUtils.isEmpty(entryEntityImportDataList)) { + return; + } + + // 进行校验 + Map indexVsMsgMap = validateEntry(entryEntityImportDataList, existCodes); + Set indexSet = indexVsMsgMap.keySet(); + Map> logMap = e.getEntryDataMap(); + ImportLogger importLogger = (ImportLogger) logMap.get(entryName).get(0); + + // 记录错误日志 + for (Map.Entry indexVsMsgEntry : indexVsMsgMap.entrySet()) { + Integer index = indexVsMsgEntry.getKey(); + importLogger.log(index, indexVsMsgEntry.getValue()); + importLogger.fail(); + importLogger.setTotal(importLogger.getTotal() + 1); + } + + // 移除校验失败的数据 + Iterator iterator2 = entryEntityImportDataList.iterator(); + while (iterator2.hasNext()) { + ImportEntryData entryData = iterator2.next(); + Integer rowNum = (Integer) entryData.getData().get("rowNum"); + if (indexSet.contains(rowNum)) { + iterator2.remove(); + } + } + } + } catch (Exception ex) { + this.getView().showMessage(ex.getMessage()); + } + } + + + /** + * 校验物料名称、物料单位 + * @param entryDataList + * @param existingMaterialCodes + * @return + */ + private Map validateEntry(List entryDataList,Set existingMaterialCodes) { + Map indexVsMsgMap = new HashMap<>(); + + for (int i = 0; i < entryDataList.size(); i++) { + ImportEntryData entryData = entryDataList.get(i); + + // 获取当前行的 JSONObject 数据 + JSONObject data = entryData.getData(); + Map map = data.toJavaObject(Map.class); + + String materialUnit = (String) map.get("qeug_importunit"); // 物料单位 + // 获取当前行号 + Integer rowNum = (Integer) entryData.getData().get("rowNum"); + + if (materialUnit == null || materialUnit.trim().isEmpty()) { + indexVsMsgMap.put(rowNum, "第" + (i + 1) + "行:物料单位不能为空或空字符串"); + } + } + + return indexVsMsgMap; + } + + + public ImportMaterial getMaterialByNumber(String number, Set set) { + ImportMaterial result = null; + if (set != null && !set.isEmpty()) { + // 使用for-each循环遍历set + for (ImportMaterial importMaterial : set) { + String materialNumber = importMaterial.getMaterialNumber(); + if (number.equals(materialNumber)) { + result = importMaterial; + break; // 找到后立刻跳出循环 + } + } + } + return result; + } +} \ No newline at end of file diff --git a/main/java/shkd/repc/resm/opplugin/PushOASupplierOPPlugin.java b/main/java/shkd/repc/resm/opplugin/PushOASupplierOPPlugin.java index 4d74a83..727291a 100644 --- a/main/java/shkd/repc/resm/opplugin/PushOASupplierOPPlugin.java +++ b/main/java/shkd/repc/resm/opplugin/PushOASupplierOPPlugin.java @@ -106,7 +106,12 @@ public class PushOASupplierOPPlugin extends AbstractOperationServicePlugIn { customerBody.put("createTime", createtime);// "创建时间:例如2024-06-02 17:27:10", customerBody.put("updateTime", updatetime);//"更新时间:例如2024-06-02 17:27:10", customerBody.put("def1", "采购供应商");//"客商类别:默认租赁客户", - customerBody.put("RESSYS", "ISC");//"最后更新来源系统:默认ISC", + String property = System.getProperty("domain.contextUrl"); + //测试环境 + if (property != null && property.contains("test")) { + customerBody.put("RESSYS", "ISC");//todo"最后更新来源系统:默认ISC", + } + JSONArray custBankaccMapBody = new JSONArray(); //银行信息 diff --git a/main/java/shkd/todotask/todoZyTaskServiceHandler.java b/main/java/shkd/todotask/todoZyTaskServiceHandler.java index dfe91e4..b6820a4 100644 --- a/main/java/shkd/todotask/todoZyTaskServiceHandler.java +++ b/main/java/shkd/todotask/todoZyTaskServiceHandler.java @@ -89,7 +89,7 @@ public class todoZyTaskServiceHandler extends AbstractMessageServiceHandler { //https://newoa.dobechina.com String property = System.getProperty("domain.contextUrl"); //测试环境 - if ("http://isctest.dobechina.com:8022/ierp".equals(property)) { + if (property != null && property.contains("test")) { url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url; h5url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + h5url; }else { @@ -333,7 +333,7 @@ public class todoZyTaskServiceHandler extends AbstractMessageServiceHandler { //https://newoa.dobechina.com String property = System.getProperty("domain.contextUrl"); //测试环境 - if ("http://isctest.dobechina.com:8022/ierp".equals(property)) { + if (property != null && property.contains("test")) { url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + url; h5url = "http://172.31.254.240:9090/seeyon/isc.do?method=ssoISC&toUrl=" + h5url; }else {