VoucherSubmitCheckNumberOpPlugin.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package kd.cosmic.jkjt.fi.gl.opplugin;
  2. import com.alibaba.fastjson.JSONObject;
  3. import kd.bos.business.plugin.AbstractUniqueBillno;
  4. import kd.bos.business.plugin.UniqueBillno;
  5. import kd.bos.business.plugin.mode.CodeRuleModeFactory;
  6. import kd.bos.business.plugin.mode.CodeRuleNumberMode;
  7. import kd.bos.coderule.api.CodeRuleInfo;
  8. import kd.bos.coderule.opplugin.util.OrgUtil;
  9. import kd.bos.dataentity.RefObject;
  10. import kd.bos.dataentity.entity.DynamicObject;
  11. import kd.bos.dataentity.utils.StringUtils;
  12. import kd.bos.entity.BillEntityType;
  13. import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
  14. import kd.bos.entity.plugin.args.AfterOperationArgs;
  15. import kd.bos.entity.plugin.args.BeforeOperationArgs;
  16. import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
  17. import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
  18. import kd.bos.exception.KDBizException;
  19. import kd.bos.exception.KDException;
  20. import kd.bos.logging.Log;
  21. import kd.bos.logging.LogFactory;
  22. import kd.bos.orm.query.QFilter;
  23. import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
  24. import kd.fi.gl.util.QFBuilder;
  25. import kd.fi.gl.util.voucher.VoucherNumberUtils;
  26. import java.util.*;
  27. /**
  28. * @description 凭证提交操作插件,用来解决标准产品API写入的凭证不会验重的问题
  29. * @author wanghaiwu_kd
  30. * @date 2024/12/09
  31. */
  32. public class VoucherSubmitCheckNumberOpPlugin extends AbstractOperationServicePlugIn {
  33. private static final Log logger = LogFactory.getLog(VoucherSubmitCheckNumberOpPlugin.class);
  34. protected AbstractUniqueBillno uniqueBillno = new UniqueBillno();
  35. protected List<CodeRuleNumberMode> numberModes;
  36. @Override
  37. public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
  38. super.beforeExecuteOperationTransaction(e);
  39. if (this.operateOption.tryGetVariableValue("webapitag_of_datasource", new RefObject())) {
  40. String datasource = this.operateOption.getVariableValue("webapitag_of_datasource");
  41. if (String.valueOf(true).equals(datasource)) {
  42. DynamicObject[] dataEntities = e.getDataEntities();
  43. if(dataEntities.length == 1){
  44. this.numberModes = CodeRuleModeFactory.newInstance(this.operateOption, "AbstractCodeRule", this.getBillNoField((BillEntityType)this.billEntityType));
  45. singleGenerateNumber(dataEntities[0]);
  46. }
  47. }
  48. }
  49. }
  50. private void singleGenerateNumber(DynamicObject dynamicObject) {
  51. BillEntityType billEntityType = (BillEntityType)dynamicObject.getDataEntityType();
  52. CodeRuleInfo codeRuleInfo = this.getCodeRuleInfo(dynamicObject);
  53. if (codeRuleInfo != null) {
  54. this.singleGenerateNewNumber(dynamicObject, billEntityType, codeRuleInfo);
  55. }
  56. }
  57. protected CodeRuleInfo getCodeRuleInfo(DynamicObject dynamicObject) {
  58. // String entityNum = dynamicObject.getDataEntityType().getName();
  59. // String orgId = OrgUtil.getMainOrgId(dynamicObject);
  60. // return CodeRuleServiceHelper.getCodeRule(entityNum, dynamicObject, orgId);
  61. return VoucherNumberUtils.getCodeRuleInfoWithPriority(dynamicObject.getLong("org.id"));
  62. }
  63. private void singleGenerateNewNumber(DynamicObject dynamicObject, BillEntityType billEntityType, CodeRuleInfo codeRuleInfo) {
  64. logger.info("[CodeRuleOp]生成编号");
  65. String billNoFldKey = this.getBillNoField(billEntityType);
  66. this.commonGenerateNewNumber(dynamicObject, codeRuleInfo, billNoFldKey);
  67. }
  68. private void commonGenerateNewNumber(DynamicObject dynamicObject, CodeRuleInfo codeRuleInfo, String billNoFldKey) {
  69. String newNumber = dynamicObject.getString(billNoFldKey);
  70. newNumber = this.generateNumberForUniqueBillno(dynamicObject, billNoFldKey, codeRuleInfo, newNumber);
  71. dynamicObject.set(billNoFldKey, newNumber);
  72. }
  73. private String generateNumberForUniqueBillno(DynamicObject dynamicObject, String billNoFldKey, CodeRuleInfo codeRuleInfo, String number) {
  74. String entityNum = dynamicObject.getDataEntityType().getName();
  75. int loopCount = 0;
  76. while(true) {
  77. boolean existBillNum = this.uniqueBillno.checkReatedInDB(entityNum, this.getQFilterExistUniqueBillNo(billNoFldKey, number, dynamicObject));
  78. if (!existBillNum) {
  79. logger.info("[CodeRuleOp]尝试" + loopCount + "次后发现不重复的编码");
  80. break;
  81. }
  82. number = this.executeGenerateProcess(dynamicObject, codeRuleInfo);
  83. ++loopCount;
  84. if (loopCount > 50) {
  85. logger.info("[CodeRuleOp]尝试50次后依然没有发现不重复的编码,停止继续消耗流水号");
  86. break;
  87. }
  88. }
  89. return number;
  90. }
  91. protected QFilter[] getQFilterExistUniqueBillNo(String billNoFldKey, String number, DynamicObject voucherDyn) {
  92. logger.info("getQFilterExistUniqueBillNo is called.");
  93. // ((VoucherCodeRuleOp.VoucherUniqueBillNo)this.uniqueBillno).currentCheckVoucherId = voucherDyn.getLong("id");
  94. Set<String> enhancedSortItems = VoucherNumberUtils.getEnhancedSortItems(this.getCodeRuleInfo(voucherDyn));
  95. JSONObject groupByInfos = VoucherNumberUtils.getGroupByInfos(voucherDyn, enhancedSortItems);
  96. QFBuilder qfBuilder = VoucherNumberUtils.transJsonToQFBuilder(groupByInfos);
  97. qfBuilder.add("billno", "=", number);
  98. qfBuilder.add("billstatus", "in", new Object[]{"B", "C", "D"});
  99. return qfBuilder.toArray();
  100. }
  101. private String executeGenerateProcess(DynamicObject dynamicObject, CodeRuleInfo codeRuleInfo) {
  102. String number = "";
  103. if (null == this.numberModes) {
  104. return number;
  105. }
  106. try {
  107. for (CodeRuleNumberMode numberMode : this.numberModes) {
  108. number = numberMode.getNumber(dynamicObject, codeRuleInfo);
  109. }
  110. }
  111. catch (KDException e) {
  112. if (null != e.getErrorCode() && StringUtils.equals((CharSequence)"CODERULE_NO_EXECUTE", (CharSequence)e.getErrorCode().getCode())) {
  113. return number;
  114. }
  115. if (e.getErrorCode() != null && "ERRCODE_CODERULE_VALIDATE_NUMBER".equals(e.getErrorCode().getCode())) {
  116. throw new KDBizException(e.getErrorCode(), new Object[0]);
  117. }
  118. logger.error((Throwable)e);
  119. throw new KDException(e.getErrorCode(), new Object[0]);
  120. }
  121. return number;
  122. }
  123. protected String getBillNoField(BillEntityType billEntityType) {
  124. return billEntityType.getBillNo();
  125. }
  126. @Override
  127. public void beginOperationTransaction(BeginOperationTransactionArgs e) {
  128. super.beginOperationTransaction(e);
  129. }
  130. @Override
  131. public void endOperationTransaction(EndOperationTransactionArgs e) {
  132. super.endOperationTransaction(e);
  133. }
  134. @Override
  135. public void afterExecuteOperationTransaction(AfterOperationArgs e) {
  136. super.afterExecuteOperationTransaction(e);
  137. }
  138. }