dbstockbillreceive.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. package restcontroller.webmanage.sale.dbstockbill;
  2. import beans.invbal.Invbal;
  3. import com.alibaba.fastjson2.JSONArray;
  4. import com.alibaba.fastjson2.JSONObject;
  5. import common.Controller;
  6. import common.YosException;
  7. import common.annotation.API;
  8. import common.data.*;
  9. import restcontroller.R;
  10. import java.math.BigDecimal;
  11. import java.util.ArrayList;
  12. public class dbstockbillreceive extends Controller {
  13. public dbstockbillreceive(JSONObject content) throws YosException {
  14. super(content);
  15. }
  16. @API(title = "查询需要收货确认的审核调拨单", apiversion = R.ID2025090313530203.v1.class)
  17. public String queryDbstockbills_Receive() throws YosException {
  18. /*
  19. * 过滤条件设置
  20. */
  21. StringBuffer where = new StringBuffer(" 1=1 ");
  22. if (content.containsKey("where")) {
  23. JSONObject whereObject = content.getJSONObject("where");
  24. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  25. where.append(" and(");
  26. where.append("t4.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  27. where.append("or t4.model like'%").append(whereObject.getString("condition")).append("%' ");
  28. where.append("or t4.spec like'%").append(whereObject.getString("condition")).append("%' ");
  29. where.append("or t4.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  30. where.append(")");
  31. }
  32. }
  33. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_dbstockbilldetail", "*");
  34. querySQL.setTableAlias("t1");
  35. querySQL.addJoinTable(JOINTYPE.left, "st_stock", "t2", "t1.instockid = t2.stockid AND t1.siteid = t2.siteid");
  36. querySQL.addJoinTable(JOINTYPE.left, "st_stock", "t3", "t1.outstockid = t3.stockid AND t1.siteid = t3.siteid");
  37. querySQL.addJoinTable(JOINTYPE.left, "plm_item", "t4", "t1.itemid=t4.itemid and t1.siteid = t4.siteid", "itemno", "itemname"
  38. , "spec", "model");
  39. querySQL.addJoinTable(JOINTYPE.left, "plm_unit", "t5", "t4.unitid=t5.unitid and t4.siteid = t5.siteid", "unitname");
  40. querySQL.addJoinTable(JOINTYPE.inner, "st_dbstockbill", "t6", "t1.st_dbstockbillid=t6.st_dbstockbillid and t1.siteid = t6.siteid", "billno", "checkdate");
  41. querySQL.addQueryFields("outstockno", "t3.stockno");
  42. querySQL.addQueryFields("outstockname", "t3.stockname");
  43. querySQL.addQueryFields("instockno", "t2.stockno");
  44. querySQL.addQueryFields("instockname", "t2.stockname");
  45. querySQL.setWhere("t1.siteid", siteid);
  46. querySQL.setWhere(where);
  47. querySQL.setWhere("t6.status='审核' and t1.undeliqty>0");
  48. querySQL.setPage(pageSize, pageNumber);
  49. querySQL.setOrderBy("t6.st_dbstockbillid desc");
  50. Rows rows = querySQL.query();
  51. return getSucReturnObject().setData(rows).toString();
  52. }
  53. @API(title = "生成入库单", apiversion = R.ID2025090314003303.v1.class)
  54. public String received() throws YosException {
  55. JSONArray st_dbstockbilldetails = content.getJSONArray("st_dbstockbilldetails");
  56. if (st_dbstockbilldetails.isEmpty()) {
  57. return getErrReturnObject().setErrMsg("未选择调拨单明细").toString();
  58. }
  59. Rows dbstockbilldetail = new Rows();
  60. Rows rows = dbConnect.runSqlQuery("select t1.*,t2.instockid,t2.billdate from st_dbstockbilldetail t1 inner join st_dbstockbill t2 on t1.siteid=t2.siteid and t1.st_dbstockbillid=t2.st_dbstockbillid where t1.siteid='" + siteid + "' and t1.undeliqty>0 and t2.status='审核'");
  61. RowsMap rowsMap = rows.toRowsMap("st_dbstockbilldetailid");
  62. long st_dbstockbillid = 0;
  63. for (Object object : st_dbstockbilldetails) {
  64. JSONObject jsonObject = (JSONObject) object;
  65. Row st_dbstockbilldetail;
  66. if (rowsMap.containsKey(jsonObject.getLong("st_dbstockbilldetailid"))) {
  67. st_dbstockbilldetail = rowsMap.get(jsonObject.getLong("st_dbstockbilldetailid")).get(0);
  68. } else {
  69. return getErrReturnObject().setErrMsg("调拨单明细不存在").toString();
  70. }
  71. if (st_dbstockbillid != 0 && st_dbstockbillid != st_dbstockbilldetail.getLong("st_dbstockbillid")) {
  72. return getErrReturnObject().setErrMsg("不能同时选择两个调拨单进行收货确认").toString();
  73. } else {
  74. st_dbstockbillid = st_dbstockbilldetail.getLong("st_dbstockbillid");
  75. }
  76. int recqty = jsonObject.getIntValue("recqty");// 收货确认数量
  77. int undeliqty = st_dbstockbilldetail.getInteger("undeliqty");// 未入库数量
  78. if (recqty > undeliqty) {
  79. return getErrReturnObject().setErrMsg("收货确认数量不能大于未入库数量").toString();
  80. }
  81. if (jsonObject.getJSONArray("skuinfos").size() > 0) {
  82. if (recqty != jsonObject.getJSONArray("skuinfos").size()) {
  83. return getErrReturnObject().setErrMsg("机器码数量与收货确认数量不匹配").toString();
  84. }
  85. }
  86. Rows skurows = dbConnect.runSqlQuery("select * from sa_itemsku where siteid='" + siteid + "' and ifnull(st_dbstockbillid,0)>0 ");
  87. RowsMap skuRowsMap = skurows.toRowsMap("sku");
  88. for (Object skuinfo : jsonObject.getJSONArray("skuinfos")) {
  89. if (!skuRowsMap.containsKey(((JSONObject) skuinfo).getString("sku"))) {
  90. return getErrReturnObject().setErrMsg("序列号" + ((JSONObject) skuinfo).getString("sku") + "不存在或者已经确认收货").toString();
  91. }
  92. }
  93. st_dbstockbilldetail.put("qty", recqty);
  94. st_dbstockbilldetail.put("skuinfos", jsonObject.getJSONArray("skuinfos"));
  95. dbstockbilldetail.add(st_dbstockbilldetail);
  96. }
  97. ArrayList<String> sqllist = new ArrayList<>();
  98. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill");
  99. long st_stockbillid = createTableID("st_stockbill");
  100. insertSQL.setUniqueid(st_stockbillid);
  101. insertSQL.setSiteid(siteid);
  102. insertSQL.setValue("billno", createBillCode("STOCKBILL2"));
  103. insertSQL.setValue("type", "其他入库");
  104. insertSQL.setValue("typemx", "调拨入库");
  105. insertSQL.setValue("rb", 1);
  106. insertSQL.setValue("sys_enterpriseid", 0);
  107. insertSQL.setValue("sourceobject", "st_dbstockbill");
  108. insertSQL.setValue("sourceid", st_dbstockbillid);
  109. insertSQL.setValue("stockid", rows.get(0).getLong("instockid"));
  110. insertSQL.setValue("remarks", "收货确认入库");
  111. insertSQL.setValue("status", "审核");
  112. insertSQL.setValue("createby", username);
  113. insertSQL.setDateValue("createdate");
  114. insertSQL.setValue("checkby", username);
  115. insertSQL.setDateValue("checkdate");
  116. insertSQL.setValue("billdate", rows.get(0).getLong("billdate"));
  117. sqllist.add(insertSQL.getSQL());
  118. int j = 1;
  119. for (Row row : dbstockbilldetail) {
  120. insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items");
  121. long st_stockbill_itemsid = createTableID("st_stockbill_items");
  122. insertSQL.setUniqueid(st_stockbill_itemsid);
  123. insertSQL.setValue("rowno", j);
  124. insertSQL.setSiteid(siteid);
  125. insertSQL.setValue("sa_dispatch_itemsid", 0);
  126. insertSQL.setValue("sourceobject", "st_dbstockbilldetail");
  127. insertSQL.setValue("sourceid", row.getLong("st_dbstockbilldetailid"));
  128. insertSQL.setValue("stockid", row.getLong("instockid"));
  129. insertSQL.setValue("itemid", row.getLong("itemid"));
  130. insertSQL.setValue("itemno", row.getString("itemno"));
  131. insertSQL.setValue("itemname", row.getString("itemname"));
  132. insertSQL.setValue("model", row.getString("model"));
  133. insertSQL.setValue("qty", row.getBigDecimal("qty"));
  134. insertSQL.setValue("st_stockbillid", st_stockbillid);
  135. sqllist.add(insertSQL.getSQL());
  136. j++;
  137. for (Object objectdetail : row.getJSONArray("skuinfos")) {
  138. JSONObject rowdetail = (JSONObject) objectdetail;
  139. insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items_sku");
  140. long st_stockbill_items_skuid = createTableID("st_stockbill_items_sku");
  141. insertSQL.setUniqueid(st_stockbill_items_skuid);
  142. insertSQL.setSiteid(siteid);
  143. insertSQL.setValue("stockid", row.getLong("instockid"));
  144. insertSQL.setValue("itemid", row.getLong("itemid"));
  145. insertSQL.setValue("sku", rowdetail.getString("sku"));
  146. insertSQL.setValue("st_stockbillid", st_stockbillid);
  147. insertSQL.setValue("st_stockbill_itemsid", st_stockbill_itemsid);
  148. sqllist.add(insertSQL.getSQL());
  149. sqllist.add("update sa_itemsku set stockid=" + row.getLong("instockid") + ",st_dbstockbillid=0,st_dbstockbilldetailid=0 where sku='" + rowdetail.getString("sku") + "'");
  150. }
  151. }
  152. sqllist.addAll(updateIcinvbal(true, true, dbstockbilldetail));
  153. sqllist.addAll(updateUnInQty(true, dbstockbilldetail));
  154. dbConnect.runSqlUpdate(sqllist);
  155. return getSucReturnObject().toString();
  156. }
  157. public ArrayList<String> updateIcinvbal(boolean ischeck, boolean isinstock, Rows dbstockbilldetail) throws YosException {
  158. ArrayList<String> sqlList = new ArrayList();
  159. ArrayList<Long> itemids = new ArrayList<Long>();
  160. itemids = dbstockbilldetail.toArrayList("itemid", new ArrayList<>());
  161. itemids.add((long) 0);
  162. int i = 0;
  163. String sql = "select * from st_invbal where itemid in" + itemids;
  164. sql = sql.replace("[", "(").replace("]", ")");
  165. Rows invbals = dbConnect.runSqlQuery(sql);
  166. RowsMap invbalsRowsMap = invbals.toRowsMap("itemid");
  167. RowsMap invbalsSaleRowsMap = SQLFactory.createQuerySQL(dbConnect, "st_invbal_sale").setWhere("siteid", siteid).setWhere("itemid", itemids).query().toRowsMap("itemid");
  168. for (Row row : dbstockbilldetail) {
  169. String itemid = row.getString("itemid");
  170. //String batchno = row.getString("batchno");
  171. //String fdcspno = row.getString("fdcspno");
  172. long stockid;
  173. if ((ischeck && isinstock) || (!ischeck && !isinstock)) {
  174. stockid = row.getLong("instockid");
  175. } else {
  176. stockid = row.getLong("outstockid");
  177. }
  178. // if (type == 1 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  179. // fdcspno = "**********";
  180. // fbatchno = "**********";
  181. // fstockno = getPaoSet("TDEPARTMENT").getPao(0)
  182. // .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  183. // icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  184. // "fitemno='" + fitemno + "' and fstockno='" + fstockno
  185. // + "' and fdcspno='" + fdcspno
  186. // + "' and fbatchno='" + fbatchno + "'");
  187. // } else if (type == 2 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  188. // fdcspno = "**********";
  189. // fbatchno = "**********";
  190. // fstockno = getPaoSet("TSUPPLIER").getPao(0)
  191. // .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  192. // icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  193. // "fitemno='" + fitemno + "' and fstockno='" + fstockno
  194. // + "' and fdcspno='" + fdcspno
  195. // + "' and fbatchno='" + fbatchno + "'");
  196. // }
  197. BigDecimal qty = isinstock ? row.getBigDecimal("qty") : row.getBigDecimal("qty").negate();
  198. if (!invbalsRowsMap.containsKey(itemid)) {
  199. SQLFactory sqlFactory = new SQLFactory(this, "即时库存新增");
  200. sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  201. sqlFactory.addParameter("qty", qty);
  202. sqlFactory.addParameter("itemid", itemid);
  203. sqlFactory.addParameter("stockid", stockid);
  204. sqlFactory.addParameter("siteid", siteid);
  205. sqlFactory.addParameter("userid", userid);
  206. sqlFactory.addParameter("username", username);
  207. sqlList.add(sqlFactory.getSQL());
  208. } else {
  209. if (invbalsRowsMap.get(itemid).toRowsMap("stockid").containsKey(stockid)) {
  210. SQLFactory sqlFactory = new SQLFactory(this, "即时库存更新");
  211. sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  212. sqlFactory.addParameter("qty", invbalsRowsMap.get(itemid).toRowsMap("stockid").get(stockid).get(0).getBigDecimal("qty").add(qty));
  213. sqlFactory.addParameter("itemid", itemid);
  214. sqlFactory.addParameter("stockid", stockid);
  215. sqlFactory.addParameter("siteid", siteid);
  216. sqlFactory.addParameter("userid", userid);
  217. sqlFactory.addParameter("username", username);
  218. sqlList.add(sqlFactory.getSQL());
  219. } else {
  220. SQLFactory sqlFactory = new SQLFactory(new Invbal(), "即时库存新增");
  221. sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  222. sqlFactory.addParameter("qty", qty);
  223. sqlFactory.addParameter("itemid", itemid);
  224. sqlFactory.addParameter("stockid", stockid);
  225. System.err.println(stockid);
  226. sqlFactory.addParameter("siteid", siteid);
  227. sqlFactory.addParameter("userid", userid);
  228. sqlFactory.addParameter("username", username);
  229. sqlList.add(sqlFactory.getSQL());
  230. }
  231. }
  232. //是否为销售仓库
  233. if (SQLFactory.getRow(this, "st_stock", stockid).getBoolean("issalestock")) {
  234. if (!invbalsSaleRowsMap.containsKey(String.valueOf(itemid))) {
  235. InsertSQL invbalInsert = SQLFactory.createInsertSQL(this, "st_invbal_sale");
  236. invbalInsert.setValue("siteid", siteid);
  237. invbalInsert.setValue("itemid", itemid);
  238. invbalInsert.setValue("cansaleqty", qty.doubleValue());//可销售数量
  239. invbalInsert.setValue("candispatchqty", qty.doubleValue());//可发货数量
  240. invbalInsert.setValue("qty", qty.doubleValue());//库存数量
  241. sqlList.add(invbalInsert.getSQL());
  242. } else {
  243. UpdateSQL invbalUpdate = SQLFactory.createUpdateSQL(this, "st_invbal_sale");
  244. invbalUpdate.addValue("qty", invbalsSaleRowsMap.get(String.valueOf(itemid)).get(0).getBigDecimal("qty").add(qty));//库存数量
  245. invbalUpdate.setWhere("itemid", itemid);
  246. invbalUpdate.setWhere("siteid", siteid);
  247. sqlList.add(invbalUpdate.getSQL());
  248. }
  249. }
  250. }
  251. return sqlList;
  252. }
  253. public ArrayList<String> updateUnInQty(boolean ischeck, Rows dbstockbilldetail) {
  254. ArrayList<String> sqllist = new ArrayList<>();
  255. for (Row row : dbstockbilldetail) {
  256. if (ischeck) {// 审核
  257. sqllist.add("update st_dbstockbilldetail set undeliqty=undeliqty-" + row.getInteger("recqty") + " where st_dbstockbilldetailid='" + row.getString("st_dbstockbilldetailid") + "'");
  258. } else {// 反审核
  259. sqllist.add("update st_dbstockbilldetail set undeliqty=" + row.getBigDecimal("qty") + " where st_dbstockbilldetailid='" + row.getString("st_dbstockbilldetailid") + "'");
  260. }
  261. }
  262. return sqllist;
  263. }
  264. }