MaterialUpdateApi.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. package bamp.basedata.webapi;
  2. import kd.bd.master.enums.EnableEnum;
  3. import kd.bd.master.enums.StatusEnum;
  4. import kd.bd.master.vo.OperationApiVo;
  5. import kd.bd.master.webapi.model.GenMTAndBizInfoRespModel;
  6. import kd.bos.dataentity.OperateOption;
  7. import kd.bos.dataentity.entity.DynamicObject;
  8. import kd.bos.dataentity.entity.DynamicObjectCollection;
  9. import kd.bos.dataentity.metadata.IMetadata;
  10. import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
  11. import kd.bos.db.DB;
  12. import kd.bos.entity.operate.result.OperateErrorInfo;
  13. import kd.bos.entity.operate.result.OperationResult;
  14. import kd.bos.entity.validate.ValidateResult;
  15. import kd.bos.entity.validate.ValidateResultCollection;
  16. import kd.bos.exception.KDBizException;
  17. import kd.bos.logging.Log;
  18. import kd.bos.logging.LogFactory;
  19. import kd.bos.openapi.common.custom.annotation.ApiController;
  20. import kd.bos.openapi.common.custom.annotation.ApiParam;
  21. import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
  22. import kd.bos.openapi.common.result.CustomApiResult;
  23. import kd.bos.orm.query.QCP;
  24. import kd.bos.orm.query.QFilter;
  25. import kd.bos.servicehelper.BusinessDataServiceHelper;
  26. import kd.bos.servicehelper.operation.OperationServiceHelper;
  27. import kd.bos.servicehelper.operation.SaveServiceHelper;
  28. import kd.bos.util.ExceptionUtils;
  29. import bamp.basedata.util.WebApiUtils;
  30. import org.apache.commons.lang3.StringUtils;
  31. import javax.validation.constraints.NotEmpty;
  32. import java.text.ParseException;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. /**
  36. * @author : libo_kd
  37. * @description :
  38. * @date : 2025.01.15 9:37:54
  39. */
  40. @ApiController(
  41. desc = "更新物料和物料业务信息OpenAPI",
  42. value = "bd"
  43. )
  44. public class MaterialUpdateApi {
  45. private static final long serialVersionUID = 4434540944862847555L;
  46. private static Log logger = LogFactory.getLog(MaterialUpdateApi.class);
  47. private static final String ERR_CODE_OPERATE_FAILED = "777";
  48. private static final String ERR_CODE_SYS_EX = "999";
  49. private static final String BOM_VERSION_RULE = "bomversionrule";
  50. private static final Long BOM_VERSION_RULE_DEFAULTVAL = 780605109909666816L;
  51. int successCount = 0;
  52. int failCount = 0;
  53. @ApiPostMapping("/material_update")
  54. public CustomApiResult<List<GenMTAndBizInfoRespModel>> doCustomService(@NotEmpty @ApiParam("物料参数,List表示支持传入多个物料,Map代表一个物料,key为物料元数据上的字段,value为字段值。") List<Map<String, Object>> data) {
  55. CustomApiResult customApiResult = new CustomApiResult();
  56. customApiResult.setStatus(false);
  57. customApiResult.setErrorCode("400");
  58. try {
  59. Set<String> materialNums = data.stream().map(x -> (String) x.get("number")).collect(Collectors.toSet());
  60. DynamicObject[] findMaterial = new DynamicObject[0];
  61. if (materialNums.size() > 0) {
  62. findMaterial = BusinessDataServiceHelper.load("bd_material", "id,number", new QFilter[]{new QFilter("number", QCP.in, materialNums)});
  63. }
  64. Map resultDatasMap = new HashMap();
  65. List<Map> resultDatas = new ArrayList<Map>();
  66. for (Map mst : data) {
  67. Map resultData = new HashMap();
  68. try {
  69. String mstNum = (String) mst.get("number");
  70. Long id = 0l;
  71. if (findMaterial.length > 0) {
  72. List<DynamicObject> finds = Arrays.stream(findMaterial).filter(x -> x.getString("number").equals(mstNum)).collect(Collectors.toList());
  73. if (finds.size() > 0) id = finds.get(0).getLong("id");
  74. }
  75. if (id != null && id != 0L) {
  76. mst.put("id", id);
  77. forceSetStatusAndEnable(mst);
  78. updateMasterData(id, mst, "bd_material", resultData);
  79. successCount++;
  80. } else {
  81. forceSetStatusAndEnable(mst);
  82. createMasterData(mst, "bd_material", resultData);
  83. successCount++;
  84. }
  85. } catch (Exception e) {
  86. resultData.put("id", "");
  87. resultData.put("errors", e.getMessage());
  88. resultData.put("billStatus", false);
  89. logger.error(ExceptionUtils.getExceptionStackTraceMessage(e));
  90. failCount++;
  91. }
  92. resultDatas.add(resultData);
  93. }
  94. resultDatasMap.put("failCount",failCount);
  95. resultDatasMap.put("successCount",successCount);
  96. resultDatasMap.put("result",resultDatas);
  97. customApiResult.setData(resultDatasMap);
  98. if(failCount>0) {
  99. customApiResult.setStatus(false);
  100. customApiResult.setErrorCode("603");
  101. }else{
  102. customApiResult.setStatus(true);
  103. customApiResult.setErrorCode("0");
  104. }
  105. } catch (Exception e) {
  106. customApiResult.setStatus(false);
  107. customApiResult.setMessage(e.getMessage());
  108. customApiResult.setErrorCode("400");
  109. }
  110. return customApiResult;
  111. }
  112. public void createMasterData(Map newDatas, String entityName, Map resultData) throws ParseException {
  113. long materialId = DB.genLongId("T_BD_MATERIAL");
  114. Map<String, OperationApiVo> errorMap = null;
  115. DynamicObject material = BusinessDataServiceHelper.newDynamicObject(entityName);
  116. material.set("id", materialId);
  117. setHeadValue(newDatas, material, resultData);
  118. //数据状态
  119. material.set("status", "A");
  120. //使用状态
  121. material.set("enable", "1");
  122. if (resultData.get("errors") != null && !"".equals(resultData.get("errors"))) {
  123. List errors = new ArrayList();
  124. errors.add(resultData.get("errors"));
  125. resultData.put("id", "");
  126. resultData.put("errors", errors);
  127. resultData.put("billStatus", false);
  128. } else {
  129. //保存客户对象
  130. String status = material.getString("status");
  131. if ("A".equals(status)) {//暂存,走正常逻辑
  132. doAddNew(resultData, material);
  133. if (resultData.get("errors") == null) {
  134. generateMaterialBizInfo(material,newDatas,resultData);
  135. if (resultData.get("errors") != null && !"".equals(resultData.get("errors"))) {
  136. if(!((Boolean)resultData.get("billStatus"))) {
  137. throw new KDBizException(resultData.get("errors").toString());
  138. }
  139. }
  140. }
  141. }
  142. }
  143. }
  144. private void generateMaterialBizInfo(DynamicObject material, Map newDatas, Map resultData) throws ParseException {
  145. //采购信息
  146. if (newDatas.get("bd_materialpurchaseinfo") != null) {
  147. List<Map> mapEntrys = (List<Map>) newDatas.get("bd_materialpurchaseinfo");
  148. initMaterialBizInfoByMaterial(mapEntrys, resultData, material,"bd_materialpurchaseinfo");
  149. } else {
  150. resultData.put("errors", "参数【bd_materialpurchaseinfo】必填");
  151. }
  152. //销售信息
  153. if (newDatas.get("bd_materialsalinfo") != null) {
  154. List<Map> mapEntrys = (List<Map>) newDatas.get("bd_materialsalinfo");
  155. initMaterialBizInfoByMaterial(mapEntrys, resultData, material,"bd_materialsalinfo");
  156. } else {
  157. resultData.put("errors", "参数【bd_materialsalinfo】必填");
  158. }
  159. //库存信息
  160. if (newDatas.get("bd_materialinventoryinfo") != null) {
  161. List<Map> mapEntrys = (List<Map>) newDatas.get("bd_materialinventoryinfo");
  162. initMaterialBizInfoByMaterial(mapEntrys, resultData, material,"bd_materialinventoryinfo");
  163. } else {
  164. resultData.put("errors", "参数【bd_materialinventoryinfo】必填");
  165. }
  166. //子码信息
  167. if (newDatas.get("pznm_materialzm") != null) {
  168. List<Map> mapEntrys = (List<Map>) newDatas.get("pznm_materialzm");
  169. initMaterialZMByMaterial(mapEntrys, resultData, material);
  170. }
  171. }
  172. public void initMaterialBizInfoByMaterial(List<Map> mapEntrys, Map resultData,DynamicObject material,String bizInfoFormId) throws ParseException {
  173. logger.info("initMaterialBizInfoByMaterial, materialList size:" + mapEntrys.size() + ",bizInfoFormId:" + bizInfoFormId);
  174. List<String> createOrgs = (List)mapEntrys.stream().map((m) -> {
  175. return m.get("createorg_number");
  176. }).distinct().collect(Collectors.toList());
  177. List<String> selectFields =BusinessDataServiceHelper.newDynamicObject(bizInfoFormId).getDataEntityType().getProperties().stream().map(IMetadata:: getName).collect(Collectors.toList());
  178. QFilter materialfilter=new QFilter("masterid",QCP.equals,material.getPkValue());
  179. QFilter orgfilter=new QFilter("createorg.number",QCP.in,createOrgs);
  180. DynamicObject[] findbizInfoForm=BusinessDataServiceHelper.load(bizInfoFormId, StringUtils.join(selectFields.toArray(), ','),new QFilter[]{materialfilter,orgfilter});
  181. //查询过滤条件,缓存存在的字码Map记录
  182. Map isHaveOrgs_number = new HashMap();
  183. for(DynamicObject obj : findbizInfoForm){
  184. DynamicObject org = obj.getDynamicObject("createorg");
  185. isHaveOrgs_number.put(org.getString("number"),obj);
  186. }
  187. //区分并拼接需更新和新增的记录
  188. DynamicObjectCollection add_entrys = new DynamicObjectCollection();
  189. DynamicObjectCollection update_entrys = new DynamicObjectCollection();
  190. for(Map mapEntry : mapEntrys){
  191. String orgNum = mapEntry.get("createorg_number").toString();
  192. if(isHaveOrgs_number.get(orgNum)!=null && !"".equals(isHaveOrgs_number.get(orgNum))) {
  193. //已存在,缓存修改对象
  194. DynamicObject materialBizInfo = (DynamicObject) isHaveOrgs_number.get(orgNum);
  195. //管控方式
  196. WebApiUtils.setTextField(true, "ctrlstrategy", "ctrlstrategy", mapEntry, resultData, materialBizInfo);
  197. //创建人
  198. WebApiUtils.setDynamicField(true, "creator_number", "creator", "bos_user", mapEntry, resultData, materialBizInfo);
  199. //创建时间
  200. WebApiUtils.setDateField(true, "createtime", "createtime", mapEntry, resultData, materialBizInfo);
  201. //修改人
  202. WebApiUtils.setDynamicField(true, "modifier_number", "modifier", "bos_user", mapEntry, resultData, materialBizInfo);
  203. //修改时间
  204. WebApiUtils.setDateField(true, "modifytime", "modifytime", mapEntry, resultData, materialBizInfo);
  205. //审核人
  206. WebApiUtils.setDynamicField(true, "auditor_number", "auditor", "bos_user", mapEntry, resultData, materialBizInfo);
  207. //审核时间
  208. WebApiUtils.setDateField(true, "audittime", "audittime", mapEntry, resultData, materialBizInfo);
  209. //修改人
  210. WebApiUtils.setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user", mapEntry, resultData, materialBizInfo);
  211. //审核人
  212. WebApiUtils.setDynamicField(true,"auditor_number","pznm_auditor_xh","bos_user",mapEntry, resultData, materialBizInfo);
  213. //使用状态
  214. WebApiUtils.setTextField(true, "enable", "enable", mapEntry, resultData, materialBizInfo);
  215. if(null !=mapEntry.get("enable") && "0".equals(mapEntry.get("enable"))){
  216. //禁用人
  217. WebApiUtils.setDynamicField(true, "modifier_number", "disabler", "bos_user", mapEntry, resultData, materialBizInfo);
  218. //禁用时间
  219. WebApiUtils.setDateField(true, "modifytime", "disabledate", mapEntry, resultData, materialBizInfo);
  220. }
  221. if ("bd_materialinventoryinfo".equals(bizInfoFormId)) {
  222. materialBizInfo.set("inventoryunit", material.get("baseunit"));
  223. materialBizInfo.set("baseunit", material.get("baseunit"));
  224. //允许负库存
  225. WebApiUtils.setBooleanField(false, "isallowneginv", "isallowneginv", false, mapEntry, resultData, materialBizInfo);
  226. //启用批号管理
  227. WebApiUtils.setBooleanField(true, "enablelot", "enablelot", true, mapEntry, resultData, materialBizInfo);
  228. //保质期管理
  229. WebApiUtils.setBooleanField(true, "enableshelflifemgr", "enableshelflifemgr", true, mapEntry, resultData, materialBizInfo);
  230. //保质期单位
  231. WebApiUtils.setTextField(true, "shelflifeunit", "shelflifeunit", mapEntry, resultData, materialBizInfo);
  232. //提前期单位
  233. WebApiUtils.setTextField(true, "shelflifeunit", "leadtimeunit", mapEntry, resultData, materialBizInfo);
  234. //计算方向
  235. materialBizInfo.set("caldirection","4");
  236. //保质期
  237. WebApiUtils.setTextField(true, "shelflife", "shelflife", mapEntry, resultData, materialBizInfo);
  238. } else if ("bd_materialpurchaseinfo".equals(bizInfoFormId)) {
  239. materialBizInfo.set("purchaseunit", material.get("baseunit"));
  240. } else if ("bd_materialsalinfo".equals(bizInfoFormId)) {
  241. materialBizInfo.set("salesunit", material.get("baseunit"));
  242. }
  243. update_entrys.add(materialBizInfo);
  244. }else{
  245. //不存在,缓存新增对象
  246. DynamicObject materialBizInfo = BusinessDataServiceHelper.newDynamicObject(bizInfoFormId);
  247. materialBizInfo.set("masterid", material);
  248. //管控方式
  249. WebApiUtils.setTextField(true, "ctrlstrategy", "ctrlstrategy", mapEntry, resultData, materialBizInfo);
  250. materialBizInfo.set("status", StatusEnum.SAVE.getCode());
  251. materialBizInfo.set("enable", EnableEnum.ENABLE.getCode());
  252. //创建人
  253. WebApiUtils.setDynamicField(true, "creator_number", "creator", "bos_user", mapEntry, resultData, materialBizInfo);
  254. //创建时间
  255. WebApiUtils.setDateField(true, "createtime", "createtime", mapEntry, resultData, materialBizInfo);
  256. //修改人
  257. WebApiUtils.setDynamicField(true, "modifier_number", "modifier", "bos_user", mapEntry, resultData, materialBizInfo);
  258. //修改时间
  259. WebApiUtils.setDateField(true, "modifytime", "modifytime", mapEntry, resultData, materialBizInfo);
  260. //审核人
  261. WebApiUtils.setDynamicField(true, "auditor_number", "auditor", "bos_user", mapEntry, resultData, materialBizInfo);
  262. //审核时间
  263. WebApiUtils.setDateField(true, "audittime", "audittime", mapEntry, resultData, materialBizInfo);
  264. //修改人
  265. WebApiUtils.setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user", mapEntry, resultData, materialBizInfo);
  266. //审核人
  267. WebApiUtils.setDynamicField(true,"auditor_number","pznm_auditor_xh","bos_user",mapEntry, resultData, materialBizInfo);
  268. //创建组织
  269. WebApiUtils.setDynamicField(true, "createorg_number", "createorg", "bos_org", mapEntry, resultData, materialBizInfo);
  270. if ("bd_materialinventoryinfo".equals(bizInfoFormId)) {
  271. materialBizInfo.set("inventoryunit", material.get("baseunit"));
  272. materialBizInfo.set("baseunit", material.get("baseunit"));
  273. //允许负库存
  274. WebApiUtils.setBooleanField(false, "isallowneginv", "isallowneginv", false, mapEntry, resultData, materialBizInfo);
  275. //启用批号管理
  276. WebApiUtils.setBooleanField(true, "enablelot", "enablelot", true, mapEntry, resultData, materialBizInfo);
  277. //保质期管理
  278. WebApiUtils.setBooleanField(true, "enableshelflifemgr", "enableshelflifemgr", true, mapEntry, resultData, materialBizInfo);
  279. //保质期单位
  280. WebApiUtils.setTextField(true, "shelflifeunit", "shelflifeunit", mapEntry, resultData, materialBizInfo);
  281. //提前期单位
  282. WebApiUtils.setTextField(true, "shelflifeunit", "leadtimeunit", mapEntry, resultData, materialBizInfo);
  283. //计算方向
  284. materialBizInfo.set("caldirection","4");
  285. //保质期
  286. WebApiUtils.setTextField(true, "shelflife", "shelflife", mapEntry, resultData, materialBizInfo);
  287. } else if ("bd_materialpurchaseinfo".equals(bizInfoFormId)) {
  288. materialBizInfo.set("purchaseunit", material.get("baseunit"));
  289. } else if ("bd_materialsalinfo".equals(bizInfoFormId)) {
  290. materialBizInfo.set("salesunit", material.get("baseunit"));
  291. }
  292. //数据状态
  293. materialBizInfo.set("status","A");
  294. //使用状态
  295. materialBizInfo.set("enable","1");
  296. add_entrys.add(materialBizInfo);
  297. }
  298. }
  299. DynamicObject[] real_update_entrys = new DynamicObject[update_entrys.size()];
  300. for(int i=0;i< update_entrys.size();i++){
  301. real_update_entrys[i] = update_entrys.get(i);
  302. }
  303. DynamicObject[] real_add_entrys = new DynamicObject[add_entrys.size()];
  304. for(int i=0;i< add_entrys.size();i++){
  305. real_add_entrys[i] = add_entrys.get(i);
  306. }
  307. if(resultData.get("errors")==null || "".equals(resultData.get("errors"))){
  308. //执行更新
  309. if (real_update_entrys.length > 0) {
  310. SaveServiceHelper.update(real_update_entrys);
  311. }
  312. //执行新增
  313. if (real_add_entrys.length > 0) {
  314. OperationResult result_submit = OperationServiceHelper.executeOperate("submit", bizInfoFormId,
  315. real_add_entrys, OperateOption.create());
  316. if (result_submit.isSuccess()) {
  317. OperationResult result_audit = OperationServiceHelper.executeOperate("audit", bizInfoFormId,
  318. real_add_entrys, OperateOption.create());
  319. if (!result_audit.isSuccess()) {
  320. resultData.put("errors", bizInfoFormId+"审核失败");
  321. }
  322. } else {
  323. resultData.put("errors", bizInfoFormId+"创建失败");
  324. }
  325. }
  326. }
  327. }
  328. public void initMaterialZMByMaterial(List<Map> mapEntrys, Map resultData,DynamicObject material) throws ParseException {
  329. logger.info("initMaterialZMByMaterial, materialList size:" + mapEntrys.size());
  330. //拼接组织+字码编码的过滤条件
  331. List<String> zmnumbers = new ArrayList<String>();
  332. List<String> orgnumbers = new ArrayList<String>();
  333. for(Map mapEntry : mapEntrys){
  334. zmnumbers.add(mapEntry.get("number").toString());
  335. orgnumbers.add(mapEntry.get("pznm_zmet_org_number").toString());
  336. }
  337. List<String> selectFields =BusinessDataServiceHelper.newDynamicObject("pznm_materialzm").getDataEntityType().getProperties().stream().map(IMetadata:: getName).collect(Collectors.toList());
  338. QFilter materialfilter=new QFilter("pznm_material",QCP.equals,material.getPkValue());
  339. QFilter orgfilter=new QFilter("pznm_zmet_org.number",QCP.in,orgnumbers);
  340. QFilter numberfilter=new QFilter("number",QCP.in,zmnumbers);
  341. DynamicObject[] findbizInfoForm=BusinessDataServiceHelper.load("pznm_materialzm", StringUtils.join(selectFields.toArray(), ','),new QFilter[]{materialfilter,orgfilter,numberfilter});
  342. //查询过滤条件,缓存存在的字码Map记录
  343. Map isHaveOrgs_number = new HashMap();
  344. for(DynamicObject obj : findbizInfoForm){
  345. DynamicObject org = obj.getDynamicObject("pznm_zmet_org");
  346. String org_zmnumber = org.getString("number")+"_"+obj.getString("number");
  347. isHaveOrgs_number.put(org_zmnumber,obj);
  348. }
  349. //区分并拼接需更新和新增的记录
  350. DynamicObjectCollection add_entrys = new DynamicObjectCollection();
  351. DynamicObjectCollection update_entrys = new DynamicObjectCollection();
  352. for(Map mapEntry : mapEntrys){
  353. String org_zmnumber = mapEntry.get("pznm_zmet_org_number").toString()+"_"+mapEntry.get("number").toString();
  354. if(isHaveOrgs_number.get(org_zmnumber)!=null && !"".equals(isHaveOrgs_number.get(org_zmnumber))){
  355. //已存在,缓存修改对象
  356. DynamicObject materialBizInfo = (DynamicObject) isHaveOrgs_number.get(org_zmnumber);
  357. //子码编码
  358. WebApiUtils.setTextField(true,"number","number",mapEntry, resultData, materialBizInfo);
  359. //子码名称
  360. WebApiUtils.setTextField(true,"name","name",mapEntry, resultData, materialBizInfo);
  361. //老系统编码
  362. WebApiUtils.setTextField(false,"pznm_oldnumber","pznm_oldnumber",mapEntry, resultData, materialBizInfo);
  363. //创建人
  364. WebApiUtils.setDynamicField(true, "creator_number", "creator", "bos_user", mapEntry, resultData, materialBizInfo);
  365. //创建时间
  366. WebApiUtils.setDateField(true, "createtime", "createtime", mapEntry, resultData, materialBizInfo);
  367. //修改人
  368. WebApiUtils.setDynamicField(true, "modifier_number", "modifier", "bos_user", mapEntry, resultData, materialBizInfo);
  369. //修改时间
  370. WebApiUtils.setDateField(true, "modifytime", "modifytime", mapEntry, resultData, materialBizInfo);
  371. //修改人
  372. WebApiUtils.setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user", mapEntry, resultData, materialBizInfo);
  373. //审核人
  374. //WebApiUtils.setDynamicField(true, "auditor_number", "auditor", "bos_user", mapEntry, resultData, materialBizInfo);
  375. //审核时间
  376. //WebApiUtils.setDateField(true, "audittime", "audittime", mapEntry, resultData, materialBizInfo);
  377. //使用状态
  378. WebApiUtils.setTextField(true, "enable", "enable", mapEntry, resultData, materialBizInfo);
  379. update_entrys.add(materialBizInfo);
  380. }else{
  381. //不存在,缓存新增对象
  382. DynamicObject materialBizInfo = BusinessDataServiceHelper.newDynamicObject("pznm_materialzm");
  383. //materialBizInfo.set("masterid", material);
  384. materialBizInfo.set("pznm_material", material);
  385. materialBizInfo.set("status", StatusEnum.SAVE.getCode());
  386. materialBizInfo.set("enable", EnableEnum.ENABLE.getCode());
  387. //子码编码
  388. WebApiUtils.setTextField(true,"number","number",mapEntry, resultData, materialBizInfo);
  389. //子码名称
  390. WebApiUtils.setTextField(true,"name","name",mapEntry, resultData, materialBizInfo);
  391. //老系统编码
  392. WebApiUtils.setTextField(false,"pznm_oldnumber","pznm_oldnumber",mapEntry, resultData, materialBizInfo);
  393. //创建人
  394. WebApiUtils.setDynamicField(true, "creator_number", "creator", "bos_user", mapEntry, resultData, materialBizInfo);
  395. //创建时间
  396. WebApiUtils.setDateField(true, "createtime", "createtime", mapEntry, resultData, materialBizInfo);
  397. //修改人
  398. WebApiUtils.setDynamicField(true, "modifier_number", "modifier", "bos_user", mapEntry, resultData, materialBizInfo);
  399. //修改时间
  400. WebApiUtils.setDateField(true, "modifytime", "modifytime", mapEntry, resultData, materialBizInfo);
  401. //修改人
  402. WebApiUtils.setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user", mapEntry, resultData, materialBizInfo);
  403. //审核人
  404. //WebApiUtils.setDynamicField(true, "auditor_number", "auditor", "bos_user", mapEntry, resultData, materialBizInfo);
  405. //审核时间
  406. // WebApiUtils.setDateField(true, "audittime", "audittime", mapEntry, resultData, materialBizInfo);
  407. //创建组织
  408. WebApiUtils.setDynamicField(true, "pznm_zmet_org_number", "pznm_zmet_org", "bos_org", mapEntry, resultData, materialBizInfo);
  409. //数据状态
  410. materialBizInfo.set("status","A");
  411. //使用状态
  412. materialBizInfo.set("enable","1");
  413. add_entrys.add(materialBizInfo);
  414. }
  415. }
  416. DynamicObject[] real_update_entrys = new DynamicObject[update_entrys.size()];
  417. for(int i=0;i< update_entrys.size();i++){
  418. real_update_entrys[i] = update_entrys.get(i);
  419. }
  420. DynamicObject[] real_add_entrys = new DynamicObject[add_entrys.size()];
  421. for(int i=0;i< add_entrys.size();i++){
  422. real_add_entrys[i] = add_entrys.get(i);
  423. }
  424. if(resultData.get("errors")==null || "".equals(resultData.get("errors"))){
  425. //执行更新
  426. if (real_update_entrys.length > 0) {
  427. SaveServiceHelper.update(real_update_entrys);
  428. }
  429. //执行新增
  430. if (real_add_entrys.length > 0) {
  431. OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "pznm_materialzm",
  432. real_add_entrys, OperateOption.create());
  433. if (result_submit.isSuccess()) {
  434. OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "pznm_materialzm",
  435. real_add_entrys, OperateOption.create());
  436. if (!result_audit.isSuccess()) {
  437. resultData.put("errors", "pznm_materialzm"+"审核失败");
  438. }
  439. } else {
  440. resultData.put("errors", "pznm_materialzm"+"创建失败");
  441. }
  442. }
  443. }
  444. }
  445. private void doAddNew(Map resultData, DynamicObject material) {
  446. OperationResult result_submit = OperationServiceHelper.executeOperate("submit", "bd_customer",
  447. new DynamicObject[]{material}, OperateOption.create());
  448. if (result_submit.isSuccess()) {
  449. OperationResult result_audit = OperationServiceHelper.executeOperate("audit", "bd_customer",
  450. new DynamicObject[]{material}, OperateOption.create());
  451. //执行客户对应组织分配
  452. if (result_audit.isSuccess()) {//保存客户成功
  453. resultData.put("errors", null);
  454. resultData.put("id", result_audit.getSuccessPkIds().get(0));
  455. resultData.put("billStatus", true);
  456. } else {//提交客户失败
  457. List errors = new ArrayList();
  458. ValidateResultCollection validateResults = result_audit.getValidateResult();
  459. List<ValidateResult> validateResultList = validateResults.getValidateErrors();
  460. for (ValidateResult validateResult : validateResultList) {
  461. List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
  462. for (OperateErrorInfo allErrorInfo : allErrorInfos) {
  463. errors.add(allErrorInfo.getMessage());
  464. }
  465. }
  466. resultData.put("errors", errors);
  467. resultData.put("id", "");
  468. resultData.put("billStatus", false);
  469. failCount++;
  470. }
  471. } else {
  472. List errors = new ArrayList();
  473. ValidateResultCollection validateResults = result_submit.getValidateResult();
  474. List<ValidateResult> validateResultList = validateResults.getValidateErrors();
  475. for (ValidateResult validateResult : validateResultList) {
  476. List<OperateErrorInfo> allErrorInfos = validateResult.getAllErrorInfo();
  477. for (OperateErrorInfo allErrorInfo : allErrorInfos) {
  478. errors.add(allErrorInfo.getMessage());
  479. }
  480. }
  481. resultData.put("errors", errors);
  482. resultData.put("id", "");
  483. resultData.put("billStatus", false);
  484. failCount++;
  485. }
  486. }
  487. /**
  488. * 设置单据头字段
  489. *
  490. * @param newDatas
  491. * @param material
  492. * @param resultData
  493. */
  494. private void setHeadValue(Map newDatas, DynamicObject material, Map resultData) throws ParseException {
  495. //物料编码
  496. WebApiUtils.setTextField(true, "number", "number", newDatas, resultData, material);
  497. //物料名称
  498. WebApiUtils.setTextField(true, "name", "name", newDatas, resultData, material);
  499. //规格型号
  500. WebApiUtils.setTextField(true, "modelnum", "modelnum", newDatas, resultData, material);
  501. //基本单位.编码
  502. WebApiUtils.setDynamicField(true, "baseunit_number", "baseunit", "bd_measureunits", newDatas, resultData, material);
  503. //创建人
  504. WebApiUtils.setDynamicField(true, "creator_number", "creator", "bos_user", newDatas, resultData, material);
  505. //创建时间
  506. WebApiUtils.setDateField(true, "createtime", "createtime", newDatas, resultData, material);
  507. //修改人
  508. WebApiUtils.setDynamicField(true, "modifier_number", "modifier", "bos_user", newDatas, resultData, material);
  509. //修改时间
  510. WebApiUtils.setDateField(true, "modifytime", "modifytime", newDatas, resultData, material);
  511. //审核人
  512. WebApiUtils.setDynamicField(true, "auditor_number", "approverid", "bos_user", newDatas, resultData, material);
  513. //审核时间
  514. WebApiUtils.setDateField(true, "audittime", "approvedate", newDatas, resultData, material);
  515. //修改人
  516. WebApiUtils.setDynamicField(true,"modifier_number","pznm_modifier_xh","bos_user", newDatas, resultData, material);
  517. //审核人
  518. WebApiUtils.setDynamicField(true,"auditor_number","pznm_auditor_xh","bos_user",newDatas, resultData, material);
  519. //创建组织
  520. WebApiUtils.setDynamicField(true, "createorg_number", "createorg", "bos_org", newDatas, resultData, material);
  521. //控制策略
  522. material.set("ctrlstrategy", 5);
  523. //物料类型
  524. //物资 1
  525. // 费用 7
  526. // 资产 8
  527. // 服务 9
  528. // 套件 3
  529. // 虚拟件 2
  530. // 可配置件 4
  531. // 特征件 5
  532. WebApiUtils.setTextField(true, "materialtype", "materialtype", newDatas, resultData, material);
  533. //可采购
  534. WebApiUtils.setBooleanField(false, "enablepur", "enablepur", true, newDatas, resultData, material);
  535. //可销售
  536. WebApiUtils.setBooleanField(false, "enablesale", "enablesale", true, newDatas, resultData, material);
  537. //可库存
  538. WebApiUtils.setBooleanField(false, "enableinv", "enableinv", true, newDatas, resultData, material);
  539. //可生产
  540. WebApiUtils.setBooleanField(false, "enableproduct", "enableproduct", true, newDatas, resultData, material);
  541. //可资产
  542. WebApiUtils.setBooleanField(false, "enableasset", "enableasset", true, newDatas, resultData, material);
  543. //可委外
  544. WebApiUtils.setBooleanField(false, "enableoutsource", "enableoutsource", true, newDatas, resultData, material);
  545. //可受托
  546. WebApiUtils.setBooleanField(false, "enabletrustee", "enabletrustee", true, newDatas, resultData, material);
  547. //可寄售
  548. WebApiUtils.setBooleanField(false, "enableconsign", "enableconsign", true, newDatas, resultData, material);
  549. //可VMI
  550. WebApiUtils.setBooleanField(false, "enablevmi", "enablevmi", true, newDatas, resultData, material);
  551. //助记码
  552. WebApiUtils.setTextField(false, "number", "number", newDatas, resultData, material);
  553. //旧物料编码
  554. WebApiUtils.setTextField(false, "oldnumber", "oldnumber", newDatas, resultData, material);
  555. //描述
  556. WebApiUtils.setTextField(false, "description", "description", newDatas, resultData, material);
  557. //默认税率
  558. WebApiUtils.setDynamicField(false, "taxrate_number", "taxrate", "bd_taxrate", newDatas, resultData, material);
  559. //启用辅助属性
  560. WebApiUtils.setBooleanField(true, "isuseauxpty", "isuseauxpty", true, newDatas, resultData, material);
  561. //开启辅助属性
  562. if (null != newDatas.get("isuseauxpty") && "1".equals(newDatas.get("isuseauxpty"))) {
  563. //辅助属性
  564. if (newDatas.get("auxptyentry") != null) {
  565. List<Map> mapEntrys = (List<Map>) newDatas.get("auxptyentry");
  566. doSetAuxptyentryEntry(mapEntrys, resultData, material);
  567. } else {
  568. String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
  569. resultData.put("errors", errors+"参数【auxptyentry】必填");
  570. }
  571. }
  572. //物料分类
  573. if (newDatas.get("entry_groupstandard") != null) {
  574. List<Map> mapEntrys = (List<Map>) newDatas.get("entry_groupstandard");
  575. doSetGroupEntry(mapEntrys, resultData, material);
  576. } else {
  577. String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
  578. resultData.put("errors", errors+"参数【entry_groupstandard】必填");
  579. }
  580. //业务属性
  581. if (newDatas.get("serviceattribute") != null) {
  582. List<Map> mapEntrys = (List<Map>) newDatas.get("serviceattribute");
  583. doSetServiceattributeEntry(mapEntrys, resultData, material);
  584. } else {
  585. String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
  586. resultData.put("errors", errors+"参数【serviceattribute】必填");
  587. }
  588. }
  589. /**
  590. * 填充多选基础资料,业务属性
  591. *
  592. * @param mapEntrys
  593. * @param resultData
  594. * @param material
  595. */
  596. private void doSetServiceattributeEntry(List<Map> mapEntrys, Map resultData, DynamicObject material) {
  597. DynamicObjectCollection serviceattributeCol = material.getDynamicObjectCollection("serviceattribute");
  598. serviceattributeCol.clear();
  599. for (Map mapEntry : mapEntrys) {
  600. if (null != mapEntry.get("number") && null != mapEntry.get("entity_number")) {
  601. QFilter qFilter_number = new QFilter("number", QCP.equals, mapEntry.get("number"));
  602. QFilter qFilter_entity_number = new QFilter("entity.number", QCP.equals, mapEntry.get("entity_number"));
  603. QFilter qFilter_enable = new QFilter("enable", QCP.equals, "1");
  604. QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
  605. DynamicObject objCol = BusinessDataServiceHelper.loadSingleFromCache("bd_serviceattribute", "id,number,name,entity",
  606. new QFilter[]{qFilter_number, qFilter_entity_number, qFilter_enable, qFilter_status});
  607. if (objCol != null) {
  608. DynamicObject serviceattributeObj = serviceattributeCol.addNew();
  609. serviceattributeObj.set("fbasedataid", objCol);
  610. } else {
  611. String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
  612. resultData.put("errors", errors+"参数【serviceattribute】值匹配不成功,可能的原因是:1、编码不正确;2、不符合基础资料字段查询条件");
  613. }
  614. } else {
  615. String errors = resultData.get("errors")!=null?resultData.get("errors").toString()+";":"";
  616. resultData.put("errors", errors+"参数【serviceattribute】中 【number】【entity_number】必填");
  617. }
  618. }
  619. }
  620. /**
  621. * 填充辅助属性
  622. *
  623. * @param mapEntrys
  624. * @param resultData
  625. * @param material
  626. */
  627. private void doSetAuxptyentryEntry(List<Map> mapEntrys, Map resultData, DynamicObject material) {
  628. DynamicObjectCollection entrys = material.getDynamicObjectCollection("auxptyentry");
  629. entrys.clear();
  630. for (Map mapEntry : mapEntrys) {
  631. DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
  632. //辅助属性.编码
  633. WebApiUtils.setDynamicField(true, "auxpty_number", "auxpty", "bd_auxproperty",
  634. mapEntry, resultData, newEntry);
  635. entrys.add(newEntry);
  636. }
  637. }
  638. /**
  639. * 填充分类
  640. *
  641. * @param mapEntrys
  642. * @param resultData
  643. * @param material
  644. */
  645. private void doSetGroupEntry(List<Map> mapEntrys, Map resultData, DynamicObject material) {
  646. DynamicObjectCollection entrys = material.getDynamicObjectCollection("entry_groupstandard");
  647. entrys.clear();
  648. for (Map mapEntry : mapEntrys) {
  649. DynamicObject newEntry = new DynamicObject(entrys.getDynamicObjectType());
  650. //分类标准.编码
  651. WebApiUtils.setDynamicField(true, "standardid_number", "standardid", "bd_materialgroupstandard",
  652. mapEntry, resultData, newEntry);
  653. //分类.编码
  654. WebApiUtils.setDynamicField(true, "groupid_number", "groupid", "bd_materialgroup",
  655. mapEntry, resultData, newEntry);
  656. entrys.add(newEntry);
  657. }
  658. }
  659. public void updateMasterData(Long id, Map updateData, String entityName, Map resultData) throws ParseException {
  660. Map<String, OperationApiVo> resultMap = null;
  661. DynamicObjectType dynamicObjectType = BusinessDataServiceHelper.newDynamicObject(entityName).getDynamicObjectType();
  662. DynamicObject material = BusinessDataServiceHelper.loadSingle(id, dynamicObjectType);
  663. setHeadValue(updateData, material, resultData);
  664. if (resultData.get("errors") != null && !"".equals(resultData.get("errors"))) {
  665. List errors = new ArrayList();
  666. errors.add(resultData.get("errors"));
  667. resultData.put("id", "");
  668. resultData.put("errors", errors);
  669. resultData.put("billStatus", false);
  670. } else {
  671. //保存客户对象
  672. String status = material.getString("status");
  673. if ("A".equals(status)) {//暂存,走正常逻辑
  674. doAddNew(resultData, material);
  675. } else if ("C".equals(status)) {//审核
  676. SaveServiceHelper.update(material);
  677. resultData.put("errors", null);
  678. resultData.put("id", material.getPkValue());
  679. resultData.put("billStatus", true);
  680. }
  681. generateMaterialBizInfo(material,updateData,resultData);
  682. if (resultData.get("errors") != null && !"".equals(resultData.get("errors"))) {
  683. if(!((Boolean)resultData.get("billStatus"))) {
  684. throw new KDBizException(resultData.get("errors").toString());
  685. }
  686. }
  687. resultData.put("errors", null);
  688. resultData.put("id", material.getPkValue());
  689. resultData.put("billStatus", true);
  690. }
  691. }
  692. public void forceSetStatusAndEnable(Map jsonObj) {
  693. if (jsonObj != null) {
  694. jsonObj.put("status", StatusEnum.SAVE.getCode());
  695. jsonObj.put("enable", EnableEnum.ENABLE.getCode());
  696. }
  697. }
  698. }