invoiceapply.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package restcontroller.sale.invoice;
  2. import beans.datacontrllog.DataContrlLog;
  3. import com.alibaba.fastjson.JSONObject;
  4. import common.Controller;
  5. import common.YosException;
  6. import common.annotation.API;
  7. import common.annotation.CACHEING;
  8. import common.annotation.CACHEING_CLEAN;
  9. import common.data.Row;
  10. import common.data.Rows;
  11. import common.data.RowsMap;
  12. import common.data.SQLFactory;
  13. import restcontroller.R;
  14. import restcontroller.webmanage.executorService.Executor;
  15. import java.math.BigDecimal;
  16. import java.util.ArrayList;
  17. public class invoiceapply extends Controller {
  18. public invoiceapply(JSONObject content) throws YosException {
  19. super(content);
  20. // TODO Auto-generated constructor stub
  21. }
  22. @API(title = "查询开票申请单列表", apiversion = R.ID20221219133703.v1.class)
  23. @CACHEING
  24. public String queryinvoiceapplyList() throws YosException {
  25. StringBuffer where = new StringBuffer(" 1=1 ");
  26. if (content.containsKey("where")) {
  27. JSONObject whereObject = content.getJSONObject("where");
  28. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  29. where.append(" and(");
  30. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  31. where.append("or t1.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  32. where.append("or t2.enterprisename like'%").append(whereObject.getString("condition")).append("%' ");
  33. where.append("or t1.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  34. where.append(")");
  35. }
  36. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  37. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  38. }
  39. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  40. where.append(" and t1.createdate >='").append(whereObject.getString("begindate")).append("' ");
  41. }
  42. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  43. where.append(" and t1.createdate <='").append(whereObject.getString("enddate")).append("' ");
  44. }
  45. }
  46. SQLFactory sqlFactory = new SQLFactory(this, "开票申请单列表查询", pageSize, pageNumber, pageSorting);
  47. sqlFactory.addParameter("siteid", siteid);
  48. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  49. sqlFactory.addParameter_SQL("where", where);
  50. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  51. ArrayList<Long> ids = rows.toArrayList("sa_invoiceapplyid", new ArrayList<>());
  52. SQLFactory sqlFactorySum = new SQLFactory(this, "开票申请单合计价格");
  53. sqlFactorySum.addParameter("siteid", siteid);
  54. sqlFactorySum.addParameter_in("sa_invoiceapplyid", ids);
  55. Rows sumrows = dbConnect.runSqlQuery(sqlFactorySum);
  56. RowsMap rowsMap = sumrows.toRowsMap("sa_invoiceapplyid");
  57. for (Row row : rows) {
  58. Long id = row.getLong("sa_invoiceapplyid");
  59. if (rowsMap.get(id.toString()).isNotEmpty()) {
  60. row.put("suminvoiceamount",
  61. rowsMap.get(id.toString()).get(0).getBigDecimal("suminvoiceamount").toPlainString());
  62. } else {
  63. row.put("suminvoiceamount", 0);
  64. }
  65. }
  66. return getSucReturnObject().setData(rows).toString();
  67. }
  68. @API(title = "提交", apiversion = R.ID20221219133803.v1.class)
  69. @CACHEING_CLEAN(apiversions = {R.ID20221216143003.v1.class, R.ID20221216143103.v1.class, R.ID20221219133703.v1.class})
  70. public String check() throws YosException {
  71. Long sa_invoiceapplyid = content.getLong("sa_invoiceapplyid");
  72. int invoicingpoint = 99; //开票节点 1为订单审核,2为订单发货
  73. Rows rows = dbConnect.runSqlQuery(
  74. "select sa_invoiceapplyid,status,billno,sys_enterpriseid from sa_invoiceapply where sa_invoiceapplyid ='"
  75. + sa_invoiceapplyid + "' and siteid='" + siteid + "'");
  76. if (rows.isEmpty()) {
  77. return getErrReturnObject().setErrMsg("该开票申请单不存在").toString();
  78. } else {
  79. if (!rows.get(0).getString("status").equals("新建")) {
  80. return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的开票申请单为非新建状态,无法提交")
  81. .toString();
  82. } else {
  83. Rows sys_enterpriseRows = dbConnect
  84. .runSqlQuery("select invoicingpoint from sys_enterprise where sys_enterpriseid=" + rows.get(0).getLong("sys_enterpriseid"));
  85. if (!sys_enterpriseRows.isEmpty()) {
  86. invoicingpoint = sys_enterpriseRows.get(0).getInteger("invoicingpoint");
  87. }
  88. }
  89. }
  90. if (dbConnect.runSqlQuery(
  91. "select sa_invoiceapplyid from sa_invoiceapply_order where sa_invoiceapplyid ='"
  92. + sa_invoiceapplyid + "' and siteid='" + siteid + "'").isEmpty()) {
  93. return getErrReturnObject().setErrMsg("订单信息为空不可提交").toString();
  94. }
  95. // if (dbConnect.runSqlQuery(
  96. // "select sa_invoiceapplyid from sa_invoicebill where sa_invoiceapplyid ='"
  97. // + sa_invoiceapplyid + "' and siteid='" + siteid + "'").isEmpty()) {
  98. // return getErrReturnObject().setErrMsg("开票信息为空不可提交").toString();
  99. // }
  100. if ((dbConnect.runSqlQuery(
  101. "select sa_invoiceapplyid,invoiceamount from sa_invoiceapply_order where sa_invoiceapplyid ='"
  102. + sa_invoiceapplyid + "' and siteid='" + siteid + "' order by invoiceamount asc").get(0).getBigDecimal("invoiceamount")).compareTo(BigDecimal.ZERO) <= 0) {
  103. return getErrReturnObject().setErrMsg("订单行开票金额必须大于0").toString();
  104. }
  105. Rows rowsDetail = dbConnect.runSqlQuery(
  106. "select * from sa_invoiceapply_order where sa_invoiceapplyid ='" + sa_invoiceapplyid + "' and siteid='" + siteid + "'"); //获取开票申请单表体
  107. Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.sa_orderitemsid,t4.sonum,t3.itemname from sa_invoiceapply_order t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid inner join plm_item t3 on t2.itemid=t3.itemid and t2.siteid=t3.siteid inner join sa_order t4 on t4.sa_orderid=t2.sa_orderid and t4.siteid=t2.siteid where t1.sa_invoiceapplyid ='" + sa_invoiceapplyid + "' and t1.siteid='" + siteid + "'"); //获取开票申请单表体对应的订单信息
  108. RowsMap OrderDetailRowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid"); //获取开票申请单表体对应的订单信息,订单号,商品名称的rowsmap
  109. Rows sa_orderitemsRows = dbConnect
  110. .runSqlQuery("select t1.sa_orderitemsid,t1.price,t1.invoiceamount,t1.amount from sa_orderitems t1 inner join sa_order t2 on t1.sa_orderid=t2.sa_orderid and t1.siteid=t2.siteid where t2.sys_enterpriseid=" + rows.get(0).getLong("sys_enterpriseid"));
  111. RowsMap saorderitemsRowsMap = sa_orderitemsRows.toRowsMap("sa_orderitemsid"); //获取订单已开票金额,单价,订单金额的rowsmap
  112. Rows saorderRecviceRows = dbConnect.runSqlQuery("select t1.sa_orderid,t2.sa_orderitemsid,SUM(t2.qty) as receivedqty,\r\n" +
  113. " case when SUM(t2.qty)!=t3.qty then sum(ifnull(t2.qty,0)*t3.price-ifnull(t3.returnqty,0)*t3.price) else t3.amount end as receivedamount \r\n" +
  114. "from sa_dispatch t1\r\n" +
  115. "inner join sa_dispatch_items t2 on t1.siteid=t2.siteid and t1.sa_dispatchid=t2.sa_dispatchid\r\n" +
  116. "inner join sa_orderitems t3 on t2.siteid=t3.siteid and t2.sa_orderitemsid=t3.sa_orderitemsid\r\n" +
  117. "where t1.siteid='" + siteid + "' and t1.status='关闭' \r\n" +
  118. "group by t1.siteid,t1.sa_orderid,t2.sa_orderitemsid,t3.returnqty,t3.qty,t3.price,t3.amount");
  119. RowsMap saorderRecviceRowsMap = saorderRecviceRows.toRowsMap("sa_orderitemsid"); //获取订单已收货数量、金额的rowsmap
  120. // Rows tinvoiceapply_totalview =dbConnect.runSqlQuery("select t1.* from (\r\n" +
  121. // "select sa_invoiceapplyid,sum(orderamount) as orderamount,sum(billamount) as billamount,sum(redbillamount) as redbillamount from \r\n" +
  122. // " (select sa_invoiceapplyid,ifnull(SUM(invoiceamount),0) as orderamount,0 as billamount,0 as redbillamount from sa_invoiceapply_order group by sa_invoiceapplyid\r\n" +
  123. // " union all\r\n" +
  124. // " select t1.sa_invoiceapplyid,0 as orderamount,ifnull(SUM(case when t2.rb='1' then taxincludedamount else 0 end),0) as billamount,ifnull(SUM(case when t2.rb='0' then taxincludedamount else 0 end),0) as redbillamount from sa_invoicebill_item t1\r\n" +
  125. // " inner join sa_invoicebill t2 on t1.siteid=t2.siteid and t1.sa_invoicebillid=t2.sa_invoicebillid group by t1.sa_invoiceapplyid ) t group by sa_invoiceapplyid) t1 where t1.sa_invoiceapplyid="+sa_invoiceapplyid);
  126. //
  127. // if (tinvoiceapply_totalview.get(0).getBigDecimal("orderamount").compareTo(tinvoiceapply_totalview.get(0).getBigDecimal("billamount"))!=0) {
  128. // return getErrReturnObject().setErrMsg("订单金额和开票金额不一致").toString();
  129. // }
  130. for (Row row : rowsDetail) {
  131. BigDecimal invoiceamount_order = saorderitemsRowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("invoiceamount");//订单已开票金额
  132. BigDecimal invoiceamount = row.getBigDecimal("invoiceamount");//本次开票金额
  133. BigDecimal price = saorderitemsRowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("price");//单价
  134. BigDecimal receivedamount = new BigDecimal(0);
  135. if (invoicingpoint == 1) {
  136. receivedamount = saorderitemsRowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("amount");//订单金额
  137. } else if (invoicingpoint == 2) {
  138. if (!saorderRecviceRowsMap.get(row.getLong("sa_orderitemsid")).isEmpty()) {
  139. receivedamount = saorderRecviceRowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("receivedamount");//订单已收货金额
  140. }
  141. }
  142. String fsonum = OrderDetailRowsMap.get(row.getLong("sa_orderitemsid")).get(0).getString("sonum");//订单号
  143. String fitemname = OrderDetailRowsMap.get(row.getLong("sa_orderitemsid")).get(0).getString("itemname");//商品名称
  144. if (invoiceamount.compareTo(receivedamount.subtract(invoiceamount_order)) > 0) {
  145. return getErrReturnObject().setErrMsg("订单" + fsonum + "商品" + fitemname + "本次开票金额" + invoiceamount + "超过订单可开票金额" + receivedamount.subtract(invoiceamount_order)).toString();
  146. }
  147. }
  148. ArrayList<String> sqlList = new ArrayList<>();
  149. SQLFactory sqlFactoryupdate = new SQLFactory(this, "开票申请单提交");
  150. sqlFactoryupdate.addParameter("siteid", siteid);
  151. sqlFactoryupdate.addParameter("sa_invoiceapplyid", sa_invoiceapplyid);
  152. sqlFactoryupdate.addParameter("submitby", username);
  153. sqlList.add(sqlFactoryupdate.getSQL());
  154. sqlList.add(DataContrlLog.createLog(this, "sa_invoiceapply", sa_invoiceapplyid, "提交", "开票申请单提交成功").getSQL());
  155. dbConnect.runSqlUpdate(sqlList);
  156. Executor.sendEml(this, "invoiceapplysub", sa_invoiceapplyid,new ArrayList<>());
  157. return getSucReturnObject().toString();
  158. }
  159. @API(title = "反提交", apiversion = R.ID20221219133903.v1.class)
  160. @CACHEING_CLEAN(apiversions = {R.ID20221216143003.v1.class, R.ID20221216143103.v1.class, R.ID20221219133703.v1.class})
  161. public String uncheck() throws YosException {
  162. Long sa_invoiceapplyid = content.getLong("sa_invoiceapplyid");
  163. Long sa_orderid = 0L;
  164. Rows rows = dbConnect.runSqlQuery(
  165. "select sa_invoiceapplyid,status,billno from sa_invoiceapply where sa_invoiceapplyid ='"
  166. + sa_invoiceapplyid + "' and siteid='" + siteid + "'");
  167. if (rows.isEmpty()) {
  168. return getErrReturnObject().setErrMsg("该开票申请单不存在").toString();
  169. } else {
  170. if (!rows.get(0).getString("status").equals("提交")) {
  171. return getErrReturnObject().setErrMsg("单号为:【" + rows.get(0).getString("billno") + "】的开票申请单为非提交状态,无法反提交")
  172. .toString();
  173. }
  174. }
  175. ArrayList<String> sqlList = new ArrayList<>();
  176. SQLFactory sqlFactoryupdate = new SQLFactory(this, "开票申请单反提交");
  177. sqlFactoryupdate.addParameter("siteid", siteid);
  178. sqlFactoryupdate.addParameter("sa_invoiceapplyid", sa_invoiceapplyid);
  179. sqlFactoryupdate.addParameter("submitby", username);
  180. sqlList.add(sqlFactoryupdate.getSQL());
  181. sqlList.add(DataContrlLog.createLog(this, "sa_invoiceapply", sa_invoiceapplyid, "反提交", "开票申请单反提交成功").getSQL());
  182. dbConnect.runSqlUpdate(sqlList);
  183. return getSucReturnObject().toString();
  184. }
  185. }