MaterialAddNewApi.java 40 KB

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