stockbill.java 126 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128
  1. package restcontroller.webmanage.sale.stockbill;
  2. import beans.accountbalance.CashbillEntity;
  3. import beans.data.BatchDeleteErr;
  4. import beans.datacontrllog.DataContrlLog;
  5. import beans.itemprice.ItemPrice;
  6. import beans.report.Report;
  7. import beans.stockbill.Stockbill;
  8. import com.alibaba.fastjson2.JSONArray;
  9. import com.alibaba.fastjson2.JSONObject;
  10. import common.Controller;
  11. import common.YosException;
  12. import common.annotation.API;
  13. import common.annotation.CACHEING;
  14. import common.annotation.CACHEING_CLEAN;
  15. import common.data.*;
  16. import common.data.db.SQLList;
  17. import org.apache.commons.lang.StringUtils;
  18. import org.apache.poi.ss.usermodel.CellStyle;
  19. import org.apache.poi.ss.usermodel.DataFormat;
  20. import org.apache.poi.xssf.usermodel.*;
  21. import restcontroller.R;
  22. import restcontroller.webmanage.sale.order.Order;
  23. import restcontroller.webmanage.sale.order.OrderItems;
  24. import restcontroller.webmanage.sale.sendrepair.sendrepair;
  25. import restcontroller.webmanage.sale.sendrepair.sendrepair_pj;
  26. import java.math.BigDecimal;
  27. import java.text.SimpleDateFormat;
  28. import java.util.ArrayList;
  29. import java.util.Date;
  30. import java.util.HashMap;
  31. /**
  32. * 出入库单
  33. */
  34. @API(title = "出入库单")
  35. public class stockbill extends Controller {
  36. /**
  37. * 构造函数
  38. *
  39. * @param content
  40. */
  41. public stockbill(JSONObject content) throws YosException {
  42. super(content);
  43. }
  44. @API(title = "发货备注填写", apiversion = R.ID2025122319361203.v1.class)
  45. @CACHEING_CLEAN(apiClass = {Order.class})
  46. public String changeabstract() throws YosException {
  47. Long st_stockbillid = content.getLong("st_stockbillid");
  48. String abstract1 = content.getString("abstract");
  49. //通过版本更新订单表头数据
  50. updateStockBillWithVersion(this);
  51. SQLList sqllist = new SQLList();
  52. Rows orderRows = dbConnect.runSqlQuery("select distinct sa_orderid from st_stockbill_items where st_stockbillid ='" + st_stockbillid + "' and siteid='" + siteid + "'");
  53. for (Row row : orderRows) {
  54. sqllist.add("update sa_order set abstract='" + abstract1 + "' where sa_orderid=" + row.getLong("sa_orderid"));
  55. }
  56. dbConnect.runSqlUpdate(sqllist);
  57. return getSucReturnObject().toString();
  58. }
  59. @API(title = "新增销售出库单", apiversion = R.ID2025043010105603.v1.class)
  60. @CACHEING_CLEAN(apiClass = {
  61. stockbill.class,
  62. stockbillitems.class})
  63. public String insertormodify_stockbill() throws YosException {
  64. SQLList sqlList = new SQLList();
  65. // 表名
  66. String tableName = "st_stockbill";
  67. Long st_stockbillid = content.getLong("st_stockbillid");
  68. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  69. Rows contactrows = dbConnect.runSqlQuery("select * from sys_enterprise_contacts where sys_enterpriseid=" + sys_enterpriseid + " and ifnull(deleted,0)=0");
  70. Long rec_contactsid = content.getLongValue("rec_contactsid");
  71. if (contactrows.isNotEmpty()) {
  72. rec_contactsid = contactrows.get(0).getLong("contactsid");
  73. }
  74. Long departmentid = content.getLongValue("departmentid");
  75. String type = content.getStringValue("type");
  76. long stockid = content.getLongValue("stockid");
  77. String typemx = content.getStringValue("typemx");
  78. String remarks = content.getStringValue("remarks");
  79. String billdate = content.getStringValue("billdate");
  80. String outplace = content.getStringValue("outplace");
  81. String delivery = content.getStringValue("delivery");
  82. String logisticsmethod = content.getStringValue("logisticsmethod");
  83. Rows invoicerows = dbConnect.runSqlQuery("select * from sys_enterprise_finance where sys_enterpriseid=" + sys_enterpriseid + " order by isdefault desc");
  84. Rows addressrows = dbConnect.runSqlQuery("select * from sys_enterprise_contacts where sys_enterpriseid=" + sys_enterpriseid + " order by isdefault desc");
  85. RowsMap addressrowsMap = addressrows.toRowsMap("type");
  86. Rows departmentrows = dbConnect.runSqlQuery("select depname from sys_department where departmentid=" + departmentid);
  87. String depname = "";
  88. if (departmentrows.isNotEmpty()) {
  89. depname = departmentrows.get(0).getString("depname");
  90. }
  91. String invoice_enterprisename = content.getStringValue("invoice_enterprisename");
  92. String invoice_address = content.getStringValue("invoice_address");
  93. String invoice_taxno = content.getStringValue("invoice_taxno");
  94. if (invoicerows.isNotEmpty()) {
  95. invoice_enterprisename = invoicerows.get(0).getString("enterprisename");
  96. invoice_address = invoicerows.get(0).getString("address");
  97. invoice_taxno = invoicerows.get(0).getString("taxno");
  98. }
  99. String tracknumber = content.getStringValue("tracknumber");
  100. boolean isconfirm = content.getBooleanValue("isconfirm");
  101. if (st_stockbillid <= 0) {
  102. st_stockbillid = createTableID(tableName);
  103. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, tableName);
  104. insertSQL.setUniqueid(st_stockbillid);
  105. insertSQL.setSiteid(siteid);
  106. insertSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  107. insertSQL.setValue("rec_contactsid", rec_contactsid);
  108. insertSQL.setValue("departmentid", departmentid);
  109. insertSQL.setValue("stockid", stockid);
  110. insertSQL.setValue("type", type);
  111. insertSQL.setValue("typemx", typemx);
  112. insertSQL.setValue("sa_supplierid", content.getLongValue("sa_supplierid"));
  113. insertSQL.setValue("rb", content.getString("rb"));
  114. insertSQL.setValue("remarks", remarks);
  115. if (StringUtils.isBlank(billdate)) {
  116. insertSQL.setDateValue("billdate");
  117. insertSQL.setValue("period", getPeriod(false, new Date()));
  118. } else {
  119. insertSQL.setValue("billdate", billdate);
  120. insertSQL.setValue("period", getPeriod(false, content.getDate("billdate")));
  121. }
  122. if (type.equals("销售出库")) {
  123. insertSQL.setValue("billno", createBillCode("stockbill"));
  124. } else if (type.equals("其他出库单")) {
  125. insertSQL.setValue("billno", createBillCode("STOCKBILL1"));
  126. } else if (type.equals("其他入库单")) {
  127. insertSQL.setValue("billno", createBillCode("STOCKBILL2"));
  128. } else {
  129. insertSQL.setValue("billno", createBillCode("stockbill"));
  130. }
  131. String name = "";
  132. String phonenumber = "";
  133. String address = "";
  134. String province = "";
  135. String city = "";
  136. String county = "";
  137. if (content.getString("rb").equals("1") && type.equals("销售出库")) {
  138. if (depname.equals("售后部")) {
  139. if (addressrowsMap.containsKey("配件")) {
  140. name = addressrowsMap.get("配件").get(0).getString("name");
  141. phonenumber = addressrowsMap.get("配件").get(0).getString("phonenumber");
  142. address = addressrowsMap.get("配件").get(0).getString("address");
  143. province = addressrowsMap.get("配件").get(0).getString("province");
  144. city = addressrowsMap.get("配件").get(0).getString("city");
  145. county = addressrowsMap.get("配件").get(0).getString("county");
  146. } else if (addressrowsMap.containsKey("收货")) {
  147. name = addressrowsMap.get("收货").get(0).getString("name");
  148. phonenumber = addressrowsMap.get("收货").get(0).getString("phonenumber");
  149. address = addressrowsMap.get("收货").get(0).getString("address");
  150. province = addressrowsMap.get("收货").get(0).getString("province");
  151. city = addressrowsMap.get("收货").get(0).getString("city");
  152. county = addressrowsMap.get("收货").get(0).getString("county");
  153. }
  154. } else {
  155. if (addressrowsMap.containsKey("收货")) {
  156. name = addressrowsMap.get("收货").get(0).getString("name");
  157. phonenumber = addressrowsMap.get("收货").get(0).getString("phonenumber");
  158. address = addressrowsMap.get("收货").get(0).getString("address");
  159. province = addressrowsMap.get("收货").get(0).getString("province");
  160. city = addressrowsMap.get("收货").get(0).getString("city");
  161. county = addressrowsMap.get("收货").get(0).getString("county");
  162. }
  163. }
  164. }
  165. insertSQL.setValue("name", name);
  166. insertSQL.setValue("phonenumber", phonenumber);
  167. insertSQL.setValue("address", address);
  168. insertSQL.setValue("province", province);
  169. insertSQL.setValue("city", city);
  170. insertSQL.setValue("county", county);
  171. insertSQL.setValue("outplace", outplace);
  172. insertSQL.setValue("delivery", delivery);
  173. insertSQL.setValue("logisticsmethod", logisticsmethod);
  174. insertSQL.setValue("invoice_enterprisename", invoice_enterprisename);
  175. insertSQL.setValue("invoice_address", invoice_address);
  176. insertSQL.setValue("invoice_taxno", invoice_taxno);
  177. insertSQL.setValue("tracknumber", tracknumber);
  178. insertSQL.setValue("isconfirm", isconfirm);
  179. insertSQL.setValue("createby", username);
  180. insertSQL.setDateValue("createdate");
  181. insertSQL.setValue("changeby", username);
  182. insertSQL.setDateValue("changedate");
  183. insertSQL.setValue("status", "新建");
  184. insertSQL.setValue("payamount", 0);
  185. insertSQL.setValue("paydiscountamount", 0);
  186. sqlList.add(insertSQL.getSQL());
  187. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  188. } else {
  189. //通过版本更新订单表头数据
  190. updateStockBillWithVersion(this);
  191. Rows rows = dbConnect.runSqlQuery("SELECT status,sys_enterpriseid,paydiscountamount,payamount,sourceobject from st_stockbill WHERE st_stockbillid = " + st_stockbillid);
  192. if (rows.isNotEmpty()) {
  193. if (rows.get(0).getString("status").equals("新建")) {
  194. if (rows.get(0).getString("sourceobject").equals("tpartreimbursement")) {
  195. return getErrReturnObject().setErrMsg("由核销生成的出入库单无法编辑").toString();
  196. }
  197. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, tableName);
  198. updateSQL.setUniqueid(st_stockbillid);
  199. updateSQL.setSiteid(siteid);
  200. updateSQL.setValue("sys_enterpriseid", sys_enterpriseid);
  201. updateSQL.setValue("rec_contactsid", rec_contactsid);
  202. updateSQL.setValue("departmentid", departmentid);
  203. updateSQL.setValue("stockid", stockid);
  204. updateSQL.setValue("remarks", remarks);
  205. updateSQL.setValue("rb", content.getString("rb"));
  206. updateSQL.setValue("typemx", typemx);
  207. updateSQL.setValue("billdate", billdate);
  208. updateSQL.setValue("outplace", outplace);
  209. updateSQL.setValue("delivery", delivery);
  210. updateSQL.setValue("logisticsmethod", logisticsmethod);
  211. updateSQL.setValue("sa_supplierid", content.getLongValue("sa_supplierid"));
  212. updateSQL.setValue("invoice_enterprisename", content.getStringValue("invoice_enterprisename"));
  213. updateSQL.setValue("invoice_address", content.getStringValue("invoice_address"));
  214. updateSQL.setValue("invoice_taxno", content.getStringValue("invoice_taxno"));
  215. updateSQL.setValue("tracknumber", tracknumber);
  216. updateSQL.setValue("isconfirm", isconfirm);
  217. if (type.equals("销售出库")) {
  218. updateSQL.setValue("payamount", content.getBigDecimal("payamount"));
  219. updateSQL.setValue("paydiscountamount", content.getBigDecimal("paydiscountamount"));
  220. if (content.getBigDecimal("payamount").compareTo(rows.get(0).getBigDecimal("payamount")) != 0 || content.getBigDecimal("paydiscountamount").compareTo(rows.get(0).getBigDecimal("paydiscountamount")) != 0) {
  221. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "金额更新变更", "销售出库单更支付金额:" + content.getBigDecimal("payamount") + ",优惠金额:" + content.getBigDecimal("paydiscountamount")).getSQL());
  222. }
  223. }
  224. updateSQL.setValue("period", content.getStringValue("period"));
  225. updateSQL.setValue("changeby", username);
  226. updateSQL.setDateValue("changedate");
  227. sqlList.add(updateSQL.getSQL());
  228. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "更新", "销售出库单更新成功").getSQL());
  229. } else {
  230. return getErrReturnObject().setErrMsg("非新建状态下无法编辑").toString();
  231. }
  232. } else {
  233. return getErrReturnObject().setErrMsg("该销售出库单不存在").toString();
  234. }
  235. }
  236. dbConnect.runSqlUpdate(sqlList);
  237. content.put("st_stockbillid", st_stockbillid);
  238. return queryStockbillMain();
  239. }
  240. @API(title = "单据日期调整", apiversion = R.ID2025102215133403.v1.class)
  241. public String billdateChange() throws YosException {
  242. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  243. if (content.containsKey("st_stockbillids_v")) {
  244. JSONArray st_stockbillids_v = content.getJSONArray("st_stockbillids_v");
  245. for (Object object : st_stockbillids_v) {
  246. JSONObject object_v = (JSONObject) object;
  247. //通过版本更新订单表头数据
  248. updateStockBillWithVersion(this, object_v);
  249. }
  250. }
  251. Date billdate = content.getDate("billdate");
  252. String period = getPeriod(false, billdate);
  253. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, st_stockbillids.size());
  254. SQLList sqlList = new SQLList();
  255. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "*").setTableAlias("t1");
  256. querySQL.setSiteid(siteid);
  257. querySQL.setWhere("t1.st_stockbillid", st_stockbillids);
  258. Rows rows = querySQL.query();
  259. RowsMap rowsMap = rows.toRowsMap("st_stockbillid");
  260. RowsMap periodrowsMap = dbConnect.runSqlQuery("select CONCAT(year, '-',LPAD(month, 2, '0')) period,isclose from st_period where CONCAT(year, '-',LPAD(month, 2, '0'))='" + period + "'").toRowsMap("isclose");
  261. // if(periodrowsMap.get("1").toRowsMap("period").containsKey(period)){
  262. // return getErrReturnObject().setErrMsg("原单据会计期间已关闭,不可调整").toString();
  263. // }
  264. for (Object o : st_stockbillids) {
  265. long st_stockbillid = Long.parseLong(o.toString());
  266. if (rowsMap.containsKey(st_stockbillid)) {
  267. if (rowsMap.get(st_stockbillid).get(0).getString("status").equals("审核")) {
  268. if (periodrowsMap.get("1").toRowsMap("period").containsKey(period)) {
  269. batchDeleteErr.addErr(rowsMap.get(st_stockbillid).get(0).getString("billno"), "原单据会计期间已关闭,不可调整");
  270. continue;
  271. } else if (!periodrowsMap.get("0").toRowsMap("period").containsKey(period)) {
  272. batchDeleteErr.addErr(rowsMap.get(st_stockbillid).get(0).getString("billno"), "原单据会计期间未生成,不可调整");
  273. continue;
  274. }
  275. }
  276. } else {
  277. batchDeleteErr.addErr(String.valueOf(st_stockbillid), "该单据不存在");
  278. continue;
  279. }
  280. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "更新", "单据日期【" + content.getString("billdate") + "】调整成功").getSQL());
  281. sqlList.add("update st_stockbill set billdate='" + content.getString("billdate") + "',period='" + period + "' where st_stockbillid=" + st_stockbillid);
  282. sqlList.add("update sa_cashbill set billdate='" + content.getString("billdate") + "' where ownertable='st_stockbill' and ownerid=" + st_stockbillid);
  283. }
  284. dbConnect.runSqlUpdate(sqlList);
  285. HashMap<String, Object> result = new HashMap<>();
  286. String success = "共需" + st_stockbillids.size() + "张单据日期调整,其中失败" + batchDeleteErr.size() + "张!";
  287. result.put("success", success);
  288. result.put("errinfo", batchDeleteErr.getReturnObject());
  289. return getSucReturnObject().setData(result).toString();
  290. }
  291. @API(title = "出入库单详情", apiversion = R.ID20230719153803.v1.class)
  292. @CACHEING
  293. public String queryStockbillMain() throws YosException {
  294. Long st_stockbillid = content.getLong("st_stockbillid");
  295. SQLFactory sqlFactory = new SQLFactory(this, "出入库单详情");
  296. sqlFactory.addParameter("st_stockbillid", st_stockbillid);
  297. sqlFactory.addParameter("siteid", siteid);
  298. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  299. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  300. Rows rowsdetail = dbConnect.runSqlQuery("select amount,qty from st_stockbill_items where st_stockbillid=" + st_stockbillid);
  301. row.put("receivableamount", rowsdetail.sum("amount"));
  302. Rows accountbalancerows = dbConnect.runSqlQuery("select * from sa_accountbalance t1 inner join sa_accountclass t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid where t2.accountname='现金账户' and t1.sys_enterpriseid=" + row.getLong("sys_enterpriseid"));
  303. Rows stockbillrows_hong = dbConnect.runSqlQuery("select billno from st_stockbill t1 where t1.rb=0 and t1.sourceobject='st_stockbill' and t1.sourceid=" + st_stockbillid);
  304. Rows expressformrows = dbConnect.runSqlQuery("select t1.* from expressform t1 inner join sa_expressform_stockbill t2 on t1.expressformid=t2.expressformid and t1.siteid=t2.siteid where t2.st_stockbillid ='" + st_stockbillid + "' and t1.siteid='" + siteid + "' order by t1.createdate desc");
  305. if (accountbalancerows.isNotEmpty()) {
  306. row.put("discountamount_xjzh", accountbalancerows.get(0).getBigDecimal("discountamount"));
  307. } else {
  308. row.put("discountamount_xjzh", 0);
  309. }
  310. if (stockbillrows_hong.isNotEmpty()) {
  311. row.put("billno_hong", stockbillrows_hong.get(0).getString("billno"));
  312. } else {
  313. row.put("billno_hong", "");
  314. }
  315. row.put("qty", rowsdetail.sum("qty"));
  316. if (expressformrows.isEmpty()) {
  317. row.put("expressform", new Rows());
  318. row.put("expressform_mailno", "");
  319. row.put("expressform_txlogisticid", "");
  320. } else {
  321. row.put("expressform", expressformrows);
  322. row.put("expressform_mailno", expressformrows.get(0).getString("mailno"));
  323. row.put("expressform_txlogisticid", expressformrows.get(0).getString("txlogisticid"));
  324. }
  325. return getSucReturnObject().setData(row).toString();
  326. }
  327. @API(title = "查询出入库单列表", apiversion = R.ID20230719153903.v1.class)
  328. @CACHEING
  329. public String queryStockbillList() throws YosException {
  330. ArrayList<String> billtypes = new ArrayList<>();
  331. StringBuffer where = new StringBuffer(" 1=1 ");
  332. if (content.containsKey("where")) {
  333. JSONObject whereObject = content.getJSONObject("where");
  334. if (whereObject.containsKey("type") && !"".equals(whereObject.getString("type"))) {
  335. JSONArray jsonArray = whereObject.getJSONArray("type");
  336. billtypes = (ArrayList<String>) jsonArray.toJavaList(String.class);
  337. }
  338. if (whereObject.containsKey("typemx") && !"".equals(whereObject.getString("typemx"))) {
  339. where.append(" and t1.typemx ='").append(whereObject.getString("typemx")).append("' ");
  340. }
  341. if (whereObject.containsKey("status") && !"".equals(whereObject.getString("status"))) {
  342. where.append(" and t1.status ='").append(whereObject.getString("status")).append("' ");
  343. }
  344. if (whereObject.containsKey("rb") && !"".equals(whereObject.getString("rb"))) {
  345. where.append(" and t1.rb ='").append(whereObject.getString("rb")).append("' ");
  346. }
  347. if (whereObject.containsKey("begindate") && !"".equals(whereObject.getString("begindate"))) {
  348. where.append(" and t1.billdate >='").append(whereObject.getString("begindate")).append("' ");
  349. }
  350. if (whereObject.containsKey("enddate") && !"".equals(whereObject.getString("enddate"))) {
  351. where.append(" and t1.billdate <='").append(whereObject.getString("enddate")).append("' ");
  352. }
  353. if (whereObject.containsKey("remarks") && !"".equals(whereObject.getString("remarks"))) {
  354. where.append(" and t1.remarks like'%").append(whereObject.getString("remarks")).append("%' ");
  355. }
  356. if (whereObject.containsKey("dateinterval") && !"".equals(whereObject.getString("dateinterval"))) {
  357. if (whereObject.getString("dateinterval").equals("past30days")) {
  358. where.append(" and t1.billdate >=DATE_SUB(CURDATE(), INTERVAL 30 DAY)");
  359. } else if (whereObject.getString("dateinterval").equals("past15days")) {
  360. where.append(" and t1.billdate >=DATE_SUB(CURDATE(), INTERVAL 15 DAY)");
  361. } else if (whereObject.getString("dateinterval").equals("today")) {
  362. where.append(" and t1.billdate >=CURDATE()");
  363. }
  364. }
  365. if (whereObject.containsKey("checknoprint") && !"".equals(whereObject.getString("checknoprint"))) {
  366. if (whereObject.getBooleanValue("checknoprint")) {
  367. where.append(" and t1.status ='审核' and isreport=0");
  368. }
  369. }
  370. if (whereObject.containsKey("nowaybillgenerated") && !"".equals(whereObject.getString("nowaybillgenerated"))) {
  371. if (whereObject.getBooleanValue("checknoprint")) {
  372. where.append(" and t1.isreceiver=0 and ifnull(txlogisticid,'')='' ");
  373. }
  374. }
  375. if (whereObject.containsKey("paynocheck") && !"".equals(whereObject.getString("paynocheck"))) {
  376. where.append(" and t1.status ='新建' and delivery='到付'");
  377. }
  378. if (whereObject.containsKey("jfnocheck") && !"".equals(whereObject.getString("jfnocheck"))) {
  379. where.append(" and t1.status ='新建' and delivery='寄付'");
  380. }
  381. }
  382. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "*").setTableAlias("t1");
  383. if (billtypes.contains("销售出库") || billtypes.contains("返修入库") || billtypes.contains("返修出库")) {
  384. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t2", "t1.sys_enterpriseid = t2.sys_enterpriseid AND t1.siteid = t2.siteid", "enterprisename", "abbreviation");
  385. querySQL.addJoinTable(JOINTYPE.left, "sa_agents", "t3", "t1.sys_enterpriseid = t3.sys_enterpriseid AND t1.siteid = t3.siteid", "agentnum");
  386. }
  387. if (billtypes.contains("销售出库")) {
  388. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_contacts", "t4", "t1.rec_contactsid=t4.contactsid and t1.siteid = t4.siteid");
  389. querySQL.addJoinTable(JOINTYPE.left, "sa_accountbalance", "t5", "t5.sys_enterpriseid=t1.sys_enterpriseid and t1.siteid = t5.siteid and t5.sa_accountclassid =(select t1.sa_accountclassid from sa_accountclass t1 where t1.siteid='" + siteid + "' and t1.accountname='现金账户')", "discountamount");
  390. //querySQL.addJoinTable(JOINTYPE.left, "(select dataid,table_name,count(0) as printcount from sys_report_session GROUP BY dataid,table_name)", "t11", "t11.dataid=t1.st_stockbillid and t11.table_name='st_stockbill'", "printcount");
  391. querySQL.addQueryFields("recname", "t4.name");
  392. querySQL.addQueryFields("recphonenumber", "t4.phonenumber");
  393. querySQL.addQueryFields("recaddress", "t4.address");
  394. }
  395. querySQL.addJoinTable(JOINTYPE.left, "sys_department", "t6", "t1.departmentid=t6.departmentid and t1.siteid = t6.siteid", "depno", "depname");
  396. if (billtypes.contains("其他入库")) {
  397. querySQL.addJoinTable(JOINTYPE.left, "sa_supplier", "t7", "t1.sa_supplierid=t7.sa_supplierid and t1.siteid = t7.siteid", "suppno", "suppname", "suppshortname");
  398. }
  399. querySQL.addJoinTable(JOINTYPE.left, "st_stock", "t8", "t1.stockid=t8.stockid and t1.siteid = t8.siteid", "stockname");
  400. if (billtypes.contains("其他入库") || billtypes.contains("其他出库")) {
  401. querySQL.addJoinTable(JOINTYPE.left, "st_dbstockbill", "t9", "t1.sourceid=t9.st_dbstockbillid and t1.siteid = t9.siteid and t1.sourceobject='st_dbstockbill'");
  402. querySQL.addQueryFields("dbbillno", "t9.billno");
  403. }
  404. if (billtypes.contains("返修出库")) {
  405. querySQL.addJoinTable(JOINTYPE.left, "sa_sendrepair", "t10", "t10.sourceid=t1.st_stockbillid and t10.siteid = t1.siteid and t10.sourcetable='st_stockbill'", "instockdate");
  406. }
  407. querySQL.setWhere("t1.siteid", siteid);
  408. querySQL.setWhere("t1.type", billtypes);
  409. querySQL.setWhere(where);
  410. querySQL.setCondition("t1.billno", "t1.outplace", "t3.agentnum", " t2.enterprisename", "t6.depname");
  411. querySQL.setPage(pageSize, pageNumber);
  412. Rows rows = querySQL.query();
  413. ArrayList<Long> ids = rows.toArrayList("st_stockbillid", new ArrayList<>());
  414. //
  415. // HashMap<Long, Integer> reportMap = Report.getViewCount(this, "st_stockbill", ids);
  416. // for (Row row : rows) {
  417. // if (reportMap.containsKey(row.getLong("st_stockbillid"))) {
  418. // row.put("printcount", reportMap.get(row.getLong("st_stockbillid")));
  419. // }
  420. // }
  421. if (billtypes.contains("返修出库")) {
  422. QuerySQL querySQLDatail = SQLFactory.createQuerySQL(this, "st_stockbill_items", "sku", "st_stockbillid").setTableAlias("t1");
  423. querySQLDatail.addJoinTable(JOINTYPE.left, "st_stockbill_items_sku", "t2", "t1.st_stockbill_itemsid=t2.st_stockbill_itemsid and t1.siteid = t2.siteid");
  424. querySQLDatail.addJoinTable(JOINTYPE.left, "plm_item", "t3", "t3.itemid=t1.itemid and t3.siteid = t1.siteid ", "itemno", "itemname", "spec", "model");
  425. querySQLDatail.setWhere("t1.st_stockbillid", ids);
  426. Rows rowsdatail = querySQLDatail.query();
  427. RowsMap rowsdatailMap = rowsdatail.toRowsMap("st_stockbillid");
  428. for (Row row : rows) {
  429. if (rowsdatailMap.containsKey(row.getString("st_stockbillid"))) {
  430. row.put("itemskus", rowsdatailMap.get(row.getString("st_stockbillid")));
  431. }
  432. }
  433. }
  434. if (billtypes.contains("返修入库")) {
  435. //querySQL.addJoinTable(JOINTYPE.left, "(SELECT st_stockbillid,itemno,itemname,model,sku,siteid FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY st_stockbillid ORDER BY st_stockbill_itemsid ASC) AS szrowno FROM st_stockbill_items) t WHERE szrowno = 1)", "t11", "t1.st_stockbillid=t11.st_stockbillid and t1.siteid = t11.siteid","itemno","itemname","model","sku");
  436. QuerySQL querySQLDatail = SQLFactory.createQuerySQL(this, "st_stockbill_items", "itemname", "itemno", "model", "sku", "st_stockbillid").setTableAlias("t1");
  437. querySQLDatail.setWhere("t1.st_stockbillid", ids);
  438. Rows rowsdatail = querySQLDatail.query();
  439. RowsMap rowsdatailMap = rowsdatail.toRowsMap("st_stockbillid");
  440. for (Row row : rows) {
  441. if (rowsdatailMap.containsKey(row.getString("st_stockbillid"))) {
  442. row.put("itemno", rowsdatailMap.get(row.getString("st_stockbillid")).get(0).getString("itemno"));
  443. row.put("itemname", rowsdatailMap.get(row.getString("st_stockbillid")).get(0).getString("itemname"));
  444. row.put("model", rowsdatailMap.get(row.getString("st_stockbillid")).get(0).getString("model"));
  445. row.put("sku", rowsdatailMap.get(row.getString("st_stockbillid")).get(0).getString("sku"));
  446. } else {
  447. row.put("itemno", "");
  448. row.put("itemname", "");
  449. row.put("model", "");
  450. row.put("sku", "");
  451. }
  452. }
  453. }
  454. if (billtypes.contains("销售出库")) {
  455. //querySQL.addJoinTable(JOINTYPE.left, "(SELECT st_stockbillid,itemno,itemname,model,sku,siteid FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY st_stockbillid ORDER BY st_stockbill_itemsid ASC) AS szrowno FROM st_stockbill_items) t WHERE szrowno = 1)", "t11", "t1.st_stockbillid=t11.st_stockbillid and t1.siteid = t11.siteid","itemno","itemname","model","sku");
  456. QuerySQL expressformQuery = SQLFactory.createQuerySQL(this, "expressform", "*").setTableAlias("t1");
  457. expressformQuery.addJoinTable(JOINTYPE.inner, "sa_expressform_stockbill", "t2", "t2.expressformid = t1.expressformid");
  458. expressformQuery.addJoinTable(JOINTYPE.inner, "st_stockbill", "t3", "t3.st_stockbillid = t2.st_stockbillid", "tracknumber", "st_stockbillid");
  459. expressformQuery.setWhere("t3.st_stockbillid", ids);
  460. expressformQuery.setOrderBy("t1.createdate desc");
  461. expressformQuery.setDistinct(true);
  462. Rows expressformrows = expressformQuery.query();
  463. RowsMap expressformrowsMap = expressformrows.toRowsMap("st_stockbillid");
  464. for (Row row : rows) {
  465. if (expressformrowsMap.containsKey(row.getString("st_stockbillid"))) {
  466. row.put("expressform_mailno", expressformrowsMap.get(row.getString("st_stockbillid")).get(0).getString("mailno"));
  467. row.put("expressform_txlogisticid", expressformrowsMap.get(row.getString("st_stockbillid")).get(0).getString("txlogisticid"));
  468. } else {
  469. row.put("expressform_mailno", "");
  470. row.put("expressform_txlogisticid", "");
  471. }
  472. }
  473. }
  474. HashMap<Long, Integer> reportMap = Report.getViewCount(this, "st_stockbill", ids);
  475. for (Row row : rows) {
  476. if (reportMap.containsKey(row.getLong("st_stockbillid"))) {
  477. row.put("printcount", reportMap.get(row.getLong("st_stockbillid")));
  478. }
  479. row.putIfAbsent("printcount", 0);
  480. }
  481. return getSucReturnObject().setData(rows).toString();
  482. }
  483. @API(title = "删除", apiversion = R.ID20230719154003.v1.class)
  484. @CACHEING_CLEAN(apiClass = {
  485. stockbill.class,
  486. stockbillitems.class})
  487. public String delete() throws YosException {
  488. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  489. if (content.containsKey("st_stockbillids_v")) {
  490. JSONArray st_stockbillids_v = content.getJSONArray("st_stockbillids_v");
  491. for (Object object : st_stockbillids_v) {
  492. JSONObject object_v = (JSONObject) object;
  493. //通过版本更新订单表头数据
  494. updateStockBillWithVersion(this, object_v);
  495. }
  496. }
  497. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, st_stockbillids.size());
  498. for (Object o : st_stockbillids) {
  499. long st_stockbillid = Long.parseLong(o.toString());
  500. Rows RowsStatus = dbConnect.runSqlQuery("select st_stockbillid,status from st_stockbill where siteid='" + siteid + "' and st_stockbillid='" + st_stockbillid + "'");
  501. if (RowsStatus.isNotEmpty()) {
  502. if (!RowsStatus.get(0).getString("status").equals("新建")) {
  503. batchDeleteErr.addErr(st_stockbillid, "非新建状态的出入库单无法删除");
  504. continue;
  505. }
  506. }
  507. dbConnect.runSqlUpdate("delete from st_stockbill where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  508. dbConnect.runSqlUpdate("delete from st_stockbill_items where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  509. dbConnect.runSqlUpdate("delete from st_stockbill_items_sku where siteid='" + siteid + "' and st_stockbillid=" + st_stockbillid);
  510. }
  511. return batchDeleteErr.getReturnObject().toString();
  512. }
  513. @API(title = "审核", apiversion = R.ID20230719154103.v1.class, intervaltime = 5000)
  514. @CACHEING_CLEAN(apiClass = {
  515. stockbill.class,
  516. stockbillitems.class,
  517. Order.class,
  518. OrderItems.class,
  519. restcontroller.sale.stockbill.stockbill.class})
  520. public String check() throws YosException {
  521. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  522. if (content.containsKey("st_stockbillids_v")) {
  523. JSONArray st_stockbillids_v = content.getJSONArray("st_stockbillids_v");
  524. for (Object object : st_stockbillids_v) {
  525. JSONObject object_v = (JSONObject) object;
  526. //通过版本更新订单表头数据
  527. updateStockBillWithVersion(this, object_v);
  528. }
  529. }
  530. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "billno", "st_stockbillid");
  531. querySQL.setTableAlias("t1");
  532. querySQL.setSiteid(siteid);
  533. querySQL.setWhere("t1.st_stockbillid", st_stockbillids);
  534. Rows stockbillrows = querySQL.query();
  535. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, stockbillrows.size());
  536. for (Row row : stockbillrows) {
  537. long st_stockbillid = row.getLong("st_stockbillid");
  538. String billno = row.getString("billno");
  539. try {
  540. Stockbill.check(this, st_stockbillid, true);
  541. } catch (Exception e) {
  542. batchDeleteErr.addErr(billno, e.getMessage());
  543. }
  544. }
  545. HashMap<String, Object> result = new HashMap<>();
  546. String success = "共审核" + st_stockbillids.size() + "张出入库单,其中失败" + batchDeleteErr.size() + "张!";
  547. result.put("success", success);
  548. result.put("errinfo", batchDeleteErr.getReturnObject());
  549. return getSucReturnObject().setData(result).toString();
  550. }
  551. @API(title = "批量反审核(仅刷数据)", apiversion = R.ID2025121320093303.v1.class, intervaltime = 5000)
  552. public String uncheck_pl() throws YosException {
  553. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  554. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "billno", "st_stockbillid");
  555. querySQL.setTableAlias("t1");
  556. querySQL.setSiteid(siteid);
  557. querySQL.setWhere("t1.st_stockbillid", st_stockbillids);
  558. Rows stockbillrows = querySQL.query();
  559. BatchDeleteErr batchDeleteErr = BatchDeleteErr.create(this, stockbillrows.size());
  560. for (Row row : stockbillrows) {
  561. long st_stockbillid = row.getLong("st_stockbillid");
  562. String billno = row.getString("billno");
  563. try {
  564. Stockbill.check(this, st_stockbillid, false);
  565. } catch (Exception e) {
  566. batchDeleteErr.addErr(billno, e.getMessage());
  567. }
  568. }
  569. HashMap<String, Object> result = new HashMap<>();
  570. String success = "共审核" + st_stockbillids.size() + "张出入库单,其中失败" + batchDeleteErr.size() + "张!";
  571. result.put("success", success);
  572. result.put("errinfo", batchDeleteErr.getReturnObject());
  573. return getSucReturnObject().setData(result).toString();
  574. }
  575. @API(title = "反审核", apiversion = R.ID20230719154203.v1.class, intervaltime = 5000)
  576. @CACHEING_CLEAN(apiClass = {
  577. stockbill.class,
  578. stockbillitems.class,
  579. Order.class,
  580. OrderItems.class,
  581. stockbill.class,
  582. restcontroller.sale.stockbill.stockbill.class})
  583. public String uncheck() throws YosException {
  584. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  585. if (content.containsKey("st_stockbillids_v")) {
  586. JSONArray st_stockbillids_v = content.getJSONArray("st_stockbillids_v");
  587. for (Object object : st_stockbillids_v) {
  588. JSONObject object_v = (JSONObject) object;
  589. //通过版本更新订单表头数据
  590. updateStockBillWithVersion(this, object_v);
  591. }
  592. }
  593. for (Object o : st_stockbillids) {
  594. long st_stockbillid = Long.parseLong(o.toString());
  595. Stockbill.check(this, st_stockbillid, false);
  596. }
  597. return getSucReturnObject().toString();
  598. }
  599. @API(title = "生成送修单", apiversion = R.ID2025070415073603.v1.class)
  600. @CACHEING_CLEAN(apiClass = {
  601. sendrepair.class,
  602. sendrepair_pj.class})
  603. public String sendrepair() throws YosException {
  604. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  605. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "st_stockbillid", "status", "type", "typemx", "remarks", "sys_enterpriseid", "isrepair");
  606. querySQL.setTableAlias("t1");
  607. querySQL.setSiteid(siteid);
  608. querySQL.setWhere("t1.st_stockbillid", st_stockbillids.toJavaList(Long.class));
  609. Rows rows = querySQL.query();
  610. QuerySQL querySQLDetail = SQLFactory.createQuerySQL(this, "st_stockbill_items", "*");
  611. querySQLDetail.setTableAlias("t1");
  612. querySQLDetail.addJoinTable(JOINTYPE.left, "sa_aftersalesmag_items", "t2", "t1.sourceobject ='sa_aftersalesmag_items' and t1.sourceid=t2.sa_aftersalesmag_itemsid AND t1.siteid = t2.siteid", "name", "phonenumber", "address", "stockdate", "enddate", "remarks", "duty", "demand", "reason");
  613. querySQLDetail.addQueryFields("sku", "t2.machinecode");
  614. querySQLDetail.setSiteid(siteid);
  615. querySQLDetail.setWhere("t1.st_stockbillid", st_stockbillids.toJavaList(Long.class));
  616. RowsMap rowsMapDetail = querySQLDetail.query().toRowsMap("st_stockbillid");
  617. ArrayList<Long> sa_sendrepairids = new ArrayList<>();
  618. SQLList sqlList = new SQLList();
  619. for (Row row : rows) {
  620. if (!row.getString("type").equals("返修入库")) {
  621. return getErrReturnObject().setErrMsg("非返修入库单无法生成送修单").toString();
  622. }
  623. if (row.getBoolean("isrepair")) {
  624. return getErrReturnObject().setErrMsg("已生成送修单,无法再次生成").toString();
  625. }
  626. if (!row.getString("type").equals("返修入库")) {
  627. return getErrReturnObject().setErrMsg("非返修入库单无法生成送修单").toString();
  628. }
  629. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_sendrepair");
  630. long sa_sendrepairid = createTableID("sa_sendrepair");
  631. sa_sendrepairids.add(sa_sendrepairid);
  632. insertSQL.setUniqueid(sa_sendrepairid);
  633. insertSQL.setSiteid(siteid);
  634. insertSQL.setValue("billno", createBillCode("sendrepair"));
  635. insertSQL.setValue("remarks", row.getString("remarks"));
  636. insertSQL.setValue("sys_enterpriseid", row.getLong("sys_enterpriseid"));
  637. insertSQL.setValue("sourcetable", "st_stockbill");
  638. insertSQL.setValue("sourceid", row.getLong("st_stockbillid"));
  639. insertSQL.setValue("status", "新建");
  640. insertSQL.setValue("createby", username);
  641. insertSQL.setDateValue("createdate");
  642. insertSQL.setDateValue("billdate");
  643. sqlList.add(insertSQL.getSQL());
  644. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", row.getLong("st_stockbillid"), "转送修单", "转送修单成功").getSQL());
  645. ArrayList<Long> ids = rowsMapDetail.get(row.getString("st_stockbillid")).toArrayList("itemid", new ArrayList<>());
  646. HashMap<Long, ItemPrice> itemPriceRowsMap = ItemPrice.getItemPrice(this, sys_enterpriseid, ids);
  647. for (Row rowdetail : rowsMapDetail.get(row.getString("st_stockbillid"))) {
  648. insertSQL = SQLFactory.createInsertSQL(this, "sa_sendrepair_detail");
  649. long sa_sendrepair_detailid = createTableID("sa_sendrepair_detail");
  650. insertSQL.setUniqueid(sa_sendrepair_detailid);
  651. insertSQL.setSiteid(siteid);
  652. insertSQL.setValue("sa_sendrepairid", sa_sendrepairid);
  653. insertSQL.setValue("name", rowdetail.getString("name"));
  654. insertSQL.setValue("phonenumber", rowdetail.getString("phonenumber"));
  655. insertSQL.setValue("address", rowdetail.getString("address"));
  656. insertSQL.setValue("stockdate", StringUtils.isBlank(rowdetail.getString("stockdate")) ? "null" : rowdetail.getString("stockdate"));
  657. insertSQL.setValue("enddate", StringUtils.isBlank(rowdetail.getString("enddate")) ? "null" : rowdetail.getString("enddate"));
  658. insertSQL.setValue("remarks", rowdetail.getString("remarks"));
  659. insertSQL.setValue("duty", rowdetail.getString("duty"));
  660. insertSQL.setValue("demand", rowdetail.getString("demand"));
  661. insertSQL.setValue("reason", rowdetail.getString("reason"));
  662. insertSQL.setValue("qty", rowdetail.getBigDecimal("qty"));
  663. insertSQL.setValue("sku", rowdetail.getString("sku"));
  664. insertSQL.setValue("itemid", rowdetail.getString("itemid"));
  665. if (itemPriceRowsMap.containsKey(rowdetail.getLong("itemid"))) {
  666. insertSQL.setValue("price", itemPriceRowsMap.get(rowdetail.getLong("itemid")).getPrice());
  667. } else {
  668. insertSQL.setValue("price", 0);
  669. }
  670. sqlList.add(insertSQL.getSQL());
  671. sqlList.add("update st_stockbill_items set isrepair=1 where st_stockbill_itemsid=" + rowdetail.getLong("st_stockbill_itemsid"));
  672. }
  673. sqlList.add("update st_stockbill set isrepair=1 where st_stockbillid=" + row.getLong("st_stockbillid"));
  674. }
  675. dbConnect.runSqlUpdate(sqlList);
  676. return getSucReturnObject().setData(sa_sendrepairids).toString();
  677. }
  678. // public String xsckcheck(Long st_stockbillid, boolean isinstock) throws YosException {
  679. // Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  680. // + st_stockbillid + "' and siteid='" + siteid + "'");
  681. // Rows rowsdetail = dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='"
  682. // + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  683. // long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  684. //
  685. // if (rows.isEmpty()) {
  686. // return "该出入库单不存在";
  687. // } else {
  688. // if (!rows.get(0).getString("status").equals("新建")) {
  689. // return "单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非新建状态,无法审核";
  690. // }
  691. // }
  692. // for (Row row : rowsdetail) {
  693. // if (row.getBigDecimal("qty").compareTo(BigDecimal.ZERO) < 1) {
  694. // return "表体数量不能小于0";
  695. // }
  696. // }
  697. // if (rows.get(0).getBigDecimal("payamount").compareTo(BigDecimal.ZERO) <= 0) {
  698. // return "扣款金额需大于0";
  699. // }
  700. // if (StringUtils.isBlank(rows.get(0).getString("outplace"))) {
  701. // return "发货地不可为空";
  702. // }
  703. // if ((rows.get(0).getBigDecimal("payamount").add(rows.get(0).getBigDecimal("paydiscountamount"))).compareTo(rowsdetail.sum("amount")) != 0) {
  704. // return "扣款金额与应扣金额不符,不能审核";
  705. // }
  706. // Rows accountbalancerows = dbConnect.runSqlQuery("select * from sa_accountbalance t1 inner join sa_accountclass t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid where t2.accountname='现金账户' and t1.sys_enterpriseid=" + sys_enterpriseid);
  707. // if (accountbalancerows.isNotEmpty()) {
  708. // BigDecimal discountamount = accountbalancerows.get(0).getBigDecimal("discountamount");
  709. // if (rows.get(0).getBigDecimal("paydiscountamount").compareTo(discountamount) > 0) {
  710. // return "优惠金额不能大于可用优惠金额";
  711. // }
  712. // } else {
  713. // return "账户不存在";
  714. // }
  715. // SQLList sqlList = new SQLList();
  716. //// Rows stockRows= dbConnect.runSqlQuery("select * from st_stock where siteid='"+siteid+"'");
  717. //// RowsMap stockRowsMap =stockRows.toRowsMap("itemid");
  718. //
  719. // String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  720. // if (rows.get(0).getBoolean("rb")) {
  721. // if (rows.get(0).getString("type").equals("销售出库")) {
  722. // if (order_paymentnode.equals("3")) {
  723. // if (Accountbalance.judgeBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount"))) {
  724. // CashbillEntity entity = getCashbillEntity(rows.get(0).getBigDecimal("payamount"), rows.get(0).getBigDecimal("paydiscountamount"), st_stockbillid, "销售出库单审核", rows.get(0).getString("billno"), "由销售出库单" + rows.get(0).getString("billno") + "审核时生成");
  725. // JSONObject createCashbillPay = Accountbalance.createCashbillPay(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  726. // sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  727. // } else {
  728. // return "账户余额不足,还差" + Accountbalance.InsufficientBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount")) + "元!";
  729. // }
  730. // }
  731. // Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from st_stockbill_items where st_stockbillid=" + st_stockbillid + ")");
  732. // RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  733. // Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  734. // Rows rowsjudge = dbConnect.runSqlQuery("select * from (select sa_orderitemsid,sum(qty) qty from st_stockbill_items where st_stockbillid ='" + st_stockbillid + "' group by sa_orderitemsid) t1 inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid where t1.qty>t2.undeliqty");
  735. // if (rowsjudge.isNotEmpty()) {
  736. // return "存在商品已完全出库,无法审核";
  737. // }
  738. // for (Row row : rowsDispatchDetailGroup) {
  739. // sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").subtract(row.getBigDecimal("qty")) + ",deliedqty=" + (row.getBigDecimal("qty").add(rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  740. // }
  741. // for (Row row : rowsdetail) {
  742. // if (row.getBoolean("skucontrol")) {
  743. // sqlList.add("update st_stockbill_items set wmsuploadflag2=1 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  744. // }
  745. //
  746. // }
  747. // }
  748. //// for(Row row :rowsdetail){
  749. //// String itemid= row.getString("itemid");
  750. //// long stockid=row.getLong("stockid");
  751. //// if(stockRowsMap.containsKey(itemid)){
  752. //// for(Row row1 :stockRowsMap.get(itemid)){
  753. //// if(row1.getLong("stockid")==stockid){
  754. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").add(row.getBigDecimal("qty"))+" where stockid="+stockid);
  755. //// }
  756. //// }
  757. //// }
  758. //// // String batchno = row.getString("batchno");
  759. //// }
  760. // } else {
  761. //// for(Row row :rowsdetail){
  762. //// String itemid= row.getString("itemid");
  763. //// long stockid=row.getLong("stockid");
  764. //// if(stockRowsMap.containsKey(itemid)){
  765. //// for(Row row1 :stockRowsMap.get(itemid)){
  766. //// if(row1.getLong("stockid")==stockid){
  767. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").subtract(row.getBigDecimal("qty"))+" where stockid="+stockid);
  768. //// }
  769. //// }
  770. //// }
  771. //// // String batchno = row.getString("batchno");
  772. //// }
  773. // }
  774. //// Rows stockbillitems = dbConnect.runSqlQuery("select t2.sa_orderid,sum(t2.price*t1.qty) amount from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.siteid='"+siteid+"'and t1.st_stockbillid="+st_stockbillid+" group by t2.sa_orderid");
  775. //// Rows orderRows =dbConnect.runSqlQuery("select * from sa_order where sa_orderid in(select t2.sa_orderid from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.st_stockbillid='"+st_stockbillid+"')");
  776. //// RowsMap orderRowsMap =orderRows.toRowsMap("sa_orderid");
  777. //
  778. // sqlList.addAll(updateAccountbalance_freez(st_stockbillid, isinstock));
  779. //
  780. // dbConnect.runSqlUpdate(sqlList);
  781. //// Accountbalance.remindSend(this, sys_enterpriseid, sa_cashbillid);
  782. // return "success";
  783. //
  784. // }
  785. // public String unxsckcheck(Long st_stockbillid, boolean isinstock) throws YosException {
  786. //
  787. //
  788. // Rows rows = dbConnect.runSqlQuery("select * from st_stockbill where st_stockbillid ='"
  789. // + st_stockbillid + "' and siteid='" + siteid + "'");
  790. // Rows rowsdetail = dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='"
  791. // + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  792. // long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  793. //
  794. // if (rows.isEmpty()) {
  795. // return "该出入库单不存在";
  796. // } else {
  797. // if (!rows.get(0).getString("status").equals("审核")) {
  798. // return "单号为:【" + rows.get(0).getString("billno") + "】的出入库单为非审核状态,无法反审核";
  799. // }
  800. // }
  801. // for (Row row : rowsdetail) {
  802. // if (row.getBigDecimal("qty").compareTo(BigDecimal.ZERO) < 1) {
  803. // return "表体数量不能小于0";
  804. // }
  805. // }
  806. // if (rows.get(0).getBigDecimal("paydiscountamount").compareTo(BigDecimal.ZERO) < 0) {
  807. // return "优惠金额不能小于0";
  808. // }
  809. // if (rows.get(0).getBigDecimal("payamount").compareTo(BigDecimal.ZERO) <= 0) {
  810. // return "扣款金额需大于0";
  811. // }
  812. // if (StringUtils.isBlank(rows.get(0).getString("outplace"))) {
  813. // return "发货地不可为空";
  814. // }
  815. // if ((rows.get(0).getBigDecimal("payamount").add(rows.get(0).getBigDecimal("paydiscountamount"))).compareTo(rowsdetail.sum("amount")) != 0) {
  816. // return "扣款金额与应扣金额不符,不能反审核";
  817. // }
  818. // Rows accountbalancerows = dbConnect.runSqlQuery("select * from sa_accountbalance t1 inner join sa_accountclass t2 on t1.sa_accountclassid=t2.sa_accountclassid and t1.siteid=t2.siteid where t2.accountname='现金账户' and t1.sys_enterpriseid=" + sys_enterpriseid);
  819. // if (accountbalancerows.isEmpty()) {
  820. // return "账户不存在";
  821. // }
  822. // if (rows.get(0).getString("type").equals("销售出库") && rows.get(0).getBoolean("isreceiver")) {
  823. // return "经销商已经确认收货,不可进行反审核";
  824. // }
  825. // SQLList sqlList = new SQLList();
  826. //// Rows stockRows= dbConnect.runSqlQuery("select * from st_stock where siteid='"+siteid+"'");
  827. //// RowsMap stockRowsMap =stockRows.toRowsMap("itemid");
  828. //
  829. // String order_paymentnode = Parameter.getString(siteid, "order_paymentnode");
  830. // if (rows.get(0).getBoolean("rb")) {
  831. // if (rows.get(0).getString("type").equals("销售出库")) {
  832. // if (order_paymentnode.equals("3")) {
  833. // if (Accountbalance.judgeBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount").negate())) {
  834. // CashbillEntity entity = getCashbillEntity(rows.get(0).getBigDecimal("payamount").negate(), rows.get(0).getBigDecimal("paydiscountamount").negate(), st_stockbillid, "销售出库单反审核", rows.get(0).getString("billno"), "由销售出库单" + rows.get(0).getString("billno") + "反审核时生成");
  835. // JSONObject createCashbillPay = Accountbalance.createCashbillPay(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), entity, true);
  836. // sqlList.addAll(createCashbillPay.getJSONArray("sqlList").toJavaList(String.class));
  837. // } else {
  838. // return "账户余额不足,还差" + Accountbalance.InsufficientBalance(this, sys_enterpriseid, accountbalancerows.get(0).getLong("sa_accountclassid"), rowsdetail.sum("amount")) + "元!";
  839. // }
  840. // }
  841. // Rows rowsOrderDetail = dbConnect.runSqlQuery("select t1.undeliqty,t1.deliedqty,t1.qty,t1.sa_orderitemsid from sa_orderitems t1 where t1.sa_orderitemsid in (select sa_orderitemsid from st_stockbill_items where st_stockbillid=" + st_stockbillid + ")");
  842. // RowsMap rowsMap = rowsOrderDetail.toRowsMap("sa_orderitemsid");
  843. // Rows rowsDispatchDetailGroup = dbConnect.runSqlQuery("select sum(t1.qty) qty,t1.sa_orderitemsid,t1.siteid from st_stockbill_items t1 where t1.st_stockbillid=" + st_stockbillid + " group by t1.sa_orderitemsid,t1.siteid");
  844. // for (Row row : rowsDispatchDetailGroup) {
  845. // sqlList.add("update sa_orderitems set undeliqty=" + rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("undeliqty").add(row.getBigDecimal("qty")) + ",deliedqty=" + (rowsMap.get(row.getLong("sa_orderitemsid")).get(0).getBigDecimal("deliedqty").subtract(row.getBigDecimal("qty"))) + " where sa_orderitemsid=" + row.getLong("sa_orderitemsid"));
  846. // }
  847. // for (Row row : rowsdetail) {
  848. // if (row.getBoolean("skucontrol")) {
  849. // sqlList.add("update st_stockbill_items set wmsuploadflag2=0 where st_stockbill_itemsid=" + row.getLong("st_stockbill_itemsid"));
  850. // }
  851. //
  852. // }
  853. // }
  854. //// for(Row row :rowsdetail){
  855. //// String itemid= row.getString("itemid");
  856. //// long stockid=row.getLong("stockid");
  857. //// if(stockRowsMap.containsKey(itemid)){
  858. //// for(Row row1 :stockRowsMap.get(itemid)){
  859. //// if(row1.getLong("stockid")==stockid){
  860. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").subtract(row.getBigDecimal("qty"))+" where stockid="+stockid);
  861. //// }
  862. //// }
  863. //// }
  864. //// // String batchno = row.getString("batchno");
  865. //// }
  866. // } else {
  867. //// for(Row row :rowsdetail){
  868. //// String itemid= row.getString("itemid");
  869. //// long stockid=row.getLong("stockid");
  870. //// if(stockRowsMap.containsKey(itemid)){
  871. //// for(Row row1 :stockRowsMap.get(itemid)){
  872. //// if(row1.getLong("stockid")==stockid){
  873. //// sqlList.add("update st_stock set qty="+row1.getBigDecimal("qty").add(row.getBigDecimal("qty"))+" where stockid="+stockid);
  874. //// }
  875. //// }
  876. //// }
  877. //// // String batchno = row.getString("batchno");
  878. //// }
  879. // }
  880. //// Rows stockbillitems = dbConnect.runSqlQuery("select t2.sa_orderid,sum(t2.price*t1.qty) amount from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.siteid='"+siteid+"'and t1.st_stockbillid="+st_stockbillid+" group by t2.sa_orderid");
  881. //// Rows orderRows =dbConnect.runSqlQuery("select * from sa_order where sa_orderid in(select t2.sa_orderid from st_stockbill_items t1 inner join sa_orderitems t2 on t1.siteid=t2.siteid and t1.sa_orderitemsid=t2.sa_orderitemsid where t1.st_stockbillid='"+st_stockbillid+"')");
  882. //// RowsMap orderRowsMap =orderRows.toRowsMap("sa_orderid");
  883. // sqlList.addAll(updateAccountbalance_freez(st_stockbillid, isinstock));
  884. // dbConnect.runSqlUpdate(sqlList);
  885. //
  886. /// / Accountbalance.remindSend(this, sys_enterpriseid, sa_cashbillid);
  887. // return "success";
  888. // }
  889. @API(title = "仓库确认", apiversion = R.ID2025050709505703.v1.class)
  890. public String confirm() throws YosException {
  891. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  892. if (content.containsKey("st_stockbillids_v")) {
  893. JSONArray st_stockbillids_v = content.getJSONArray("st_stockbillids_v");
  894. for (Object object : st_stockbillids_v) {
  895. JSONObject object_v = (JSONObject) object;
  896. //通过版本更新订单表头数据
  897. updateStockBillWithVersion(this, object_v);
  898. }
  899. }
  900. boolean isconfirm = content.getBooleanValue("isconfirm");
  901. if (st_stockbillids.isEmpty()) {
  902. return getErrReturnObject().setErrMsg("请选择需要操作的出入库单").toString();
  903. }
  904. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "*");
  905. querySQL.setTableAlias("t1");
  906. querySQL.setSiteid(siteid);
  907. querySQL.setWhere("st_stockbillid", st_stockbillids);
  908. Rows rows = querySQL.query();
  909. SQLList sqllist = new SQLList();
  910. for (Row row : rows) {
  911. if (!row.getString("status").equals("审核")) {
  912. return getErrReturnObject().setErrMsg("单号为:【" + row.getString("billno") + "】的出入库单为非审核状态,无法进行仓库确认").toString();
  913. }
  914. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "st_stockbill");
  915. updateSQL.setUniqueid(row.getLong("st_stockbillid"));
  916. updateSQL.setSiteid(siteid);
  917. updateSQL.setValue("isconfirm", isconfirm);
  918. updateSQL.setValue("confirmby", username);
  919. updateSQL.setDateValue("confirmdate");
  920. updateSQL.setValue("changeby", username);
  921. updateSQL.setDateValue("changedate");
  922. sqllist.add(updateSQL.getSQL());
  923. if (isconfirm) {
  924. sqllist.add(DataContrlLog.createLog(this, "st_stockbill", row.getLong("st_stockbillid"), "仓库确认", row.getString("type") + "单仓库确认成功").getSQL());
  925. } else {
  926. sqllist.add(DataContrlLog.createLog(this, "st_stockbill", row.getLong("st_stockbillid"), "仓库反确认", row.getString("type") + "单仓库反确认成功").getSQL());
  927. }
  928. }
  929. dbConnect.runSqlUpdate(sqllist);
  930. return getSucReturnObject().toString();
  931. }
  932. @API(title = "红冲", apiversion = R.ID2025072409344603.v1.class)
  933. @CACHEING_CLEAN(apiClass = {
  934. stockbill.class,
  935. stockbillitems.class})
  936. public String hongc() throws YosException {
  937. long st_stockbillid = content.getLong("st_stockbillid");
  938. //通过版本更新订单表头数据
  939. updateStockBillWithVersion(this);
  940. SQLList sqlList = new SQLList();
  941. Rows rows = dbConnect.runSqlQuery("select t1.*,ifnull(t2.sa_sendrepairid,0) sa_sendrepairid from st_stockbill t1 left join sa_sendrepair t2 on t1.st_stockbillid=t2.sourceid and t1.siteid=t2.siteid and t2.sourcetable='st_stockbill' where t1.st_stockbillid ='" + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  942. Rows rowsdetail = dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='" + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  943. if (rows.isEmpty()) {
  944. return getErrReturnObject().setErrMsg("该出入库单不存在").toString();
  945. }
  946. if (!rows.get(0).getString("status").equals("审核")) {
  947. return getErrReturnObject().setErrMsg("非审核的出入库单无法红冲").toString();
  948. }
  949. if (rows.get(0).getInteger("rb") == 0) {
  950. return getErrReturnObject().setErrMsg("只能红冲蓝字出入库单").toString();
  951. }
  952. if (rows.get(0).getInteger("sa_sendrepairid") != 0) {
  953. return getErrReturnObject().setErrMsg("来源于送修单的出库单不能红冲").toString();
  954. }
  955. st_stockbillid = createTableID("st_stockbill");
  956. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill");
  957. insertSQL.setUniqueid(st_stockbillid);
  958. insertSQL.setSiteid(siteid);
  959. insertSQL.setValue("sys_enterpriseid", rows.get(0).getLong("sys_enterpriseid"));
  960. insertSQL.setValue("rec_contactsid", rows.get(0).getLong("rec_contactsid"));
  961. insertSQL.setValue("departmentid", rows.get(0).getLong("departmentid"));
  962. insertSQL.setValue("stockid", rows.get(0).getLong("stockid"));
  963. insertSQL.setValue("type", rows.get(0).getString("type"));
  964. insertSQL.setValue("typemx", rows.get(0).getString("typemx"));
  965. insertSQL.setValue("sa_supplierid", rows.get(0).getLong("sa_supplierid"));
  966. insertSQL.setValue("rb", 0);
  967. insertSQL.setValue("remarks", rows.get(0).getString("remarks"));
  968. insertSQL.setValue("billdate", getDateTime_Str());
  969. String billno = "";
  970. if (rows.get(0).getString("type").equals("销售出库")) {
  971. billno = createBillCode("stockbill");
  972. insertSQL.setValue("billno", billno);
  973. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字" + rows.get(0).getString("type") + "单【" + billno + "】").getSQL());
  974. } else if (rows.get(0).getString("type").equals("其他出库")) {
  975. billno = createBillCode("STOCKBILL1");
  976. insertSQL.setValue("billno", billno);
  977. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字" + rows.get(0).getString("type") + "单【" + billno + "】").getSQL());
  978. } else if (rows.get(0).getString("type").equals("其他入库")) {
  979. billno = createBillCode("STOCKBILL2");
  980. insertSQL.setValue("billno", billno);
  981. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字" + rows.get(0).getString("type") + "单【" + billno + "】").getSQL());
  982. } else {
  983. billno = createBillCode("stockbill");
  984. insertSQL.setValue("billno", billno);
  985. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", rows.get(0).getLong("st_stockbillid"), "红冲", "已生成红字" + rows.get(0).getString("type") + "单【" + billno + "】").getSQL());
  986. }
  987. insertSQL.setValue("outplace", rows.get(0).getString("outplace"));
  988. insertSQL.setValue("delivery", rows.get(0).getString("delivery"));
  989. insertSQL.setValue("invoice_enterprisename", rows.get(0).getString("invoice_enterprisename"));
  990. insertSQL.setValue("invoice_address", rows.get(0).getString("invoice_address"));
  991. insertSQL.setValue("invoice_taxno", rows.get(0).getString("invoice_taxno"));
  992. insertSQL.setValue("tracknumber", rows.get(0).getString("tracknumber"));
  993. insertSQL.setValue("isconfirm", rows.get(0).getString("isconfirm"));
  994. insertSQL.setValue("sourceobject", "st_stockbill");
  995. insertSQL.setValue("sourceid", rows.get(0).getLong("st_stockbillid"));
  996. insertSQL.setValue("period", rows.get(0).getString("period"));
  997. insertSQL.setValue("createby", username);
  998. insertSQL.setDateValue("createdate");
  999. insertSQL.setValue("changeby", username);
  1000. insertSQL.setDateValue("changedate");
  1001. insertSQL.setValue("status", "新建");
  1002. insertSQL.setValue("payamount", rows.get(0).getString("payamount"));
  1003. insertSQL.setValue("paydiscountamount", rows.get(0).getBigDecimal("paydiscountamount"));
  1004. sqlList.add(insertSQL.getSQL());
  1005. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新建", "由" + rows.get(0).getString("billno") + "单红冲生成").getSQL());
  1006. int i = 0;
  1007. for (Row row : rowsdetail) {
  1008. InsertSQL insertDetailSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items");
  1009. insertDetailSQL.setUniqueid(createTableID("st_stockbill_items"));
  1010. insertDetailSQL.setSiteid(siteid);
  1011. insertDetailSQL.setValue("rowno", i + 1);
  1012. insertDetailSQL.setValue("st_stockbillid", st_stockbillid);
  1013. insertDetailSQL.setValue("sa_orderitemsid", row.getLong("sa_orderitemsid"));
  1014. insertDetailSQL.setValue("itemid", row.getString("itemid"));
  1015. insertDetailSQL.setValue("sa_orderid", row.getString("sa_orderid"));
  1016. insertDetailSQL.setValue("qty", row.getString("qty"));
  1017. insertDetailSQL.setValue("discountrate", row.getBigDecimal("discountrate"));
  1018. insertDetailSQL.setValue("sa_dispatch_itemsid", 0);
  1019. insertDetailSQL.setValue("defaultprice", row.getBigDecimal("defaultprice"));
  1020. insertDetailSQL.setValue("remarks", row.getString("remarks"));
  1021. insertDetailSQL.setValue("sku", row.getString("sku"));
  1022. insertDetailSQL.setValue("itemno", row.getString("itemno"));
  1023. insertDetailSQL.setValue("itemname", row.getString("itemname"));
  1024. insertDetailSQL.setValue("model", row.getString("model"));
  1025. insertDetailSQL.setValue("price", row.getBigDecimal("price"));
  1026. insertDetailSQL.setValue("stockid", row.getString("stockid"));
  1027. insertDetailSQL.setValue("amount", row.getBigDecimal("qty").multiply(row.getBigDecimal("price")));
  1028. insertDetailSQL.setValue("untaxedprice", row.getBigDecimal("price").divide(new BigDecimal(1.13), 2, BigDecimal.ROUND_HALF_UP));
  1029. insertDetailSQL.setValue("untaxedamount", row.getBigDecimal("qty").multiply(row.getBigDecimal("price").divide(new BigDecimal(1.13), 2, BigDecimal.ROUND_HALF_UP)));
  1030. insertDetailSQL.setValue("sourceid", row.getLong("st_stockbill_itemsid"));
  1031. insertDetailSQL.setValue("sourceobject", "st_stockbill_items");
  1032. sqlList.add(insertDetailSQL.getSQL());
  1033. }
  1034. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  1035. dbConnect.runSqlUpdate(sqlList);
  1036. content.put("st_stockbillid", st_stockbillid);
  1037. return queryStockbillMain();
  1038. }
  1039. @API(title = "序列号收集", apiversion = R.ID2025101613261703.v1.class, intervaltime = 2000)
  1040. @CACHEING_CLEAN(apiClass = {
  1041. stockbill.class,
  1042. stockbillitems.class,
  1043. stockbillitemssku.class})
  1044. public String skuCollect() throws YosException {
  1045. long stockid = content.getLong("stockid");
  1046. String sku = content.getString("sku");
  1047. long st_stockbillid = content.getLong("st_stockbillid");
  1048. long st_stockbill_itemsid = content.getLong("st_stockbill_itemsid");
  1049. String ss = "&&%$&&";
  1050. if (sku.contains(",")) {
  1051. ss = ",";
  1052. } else if (sku.contains(",")) {
  1053. ss = ",";
  1054. } else if (sku.contains(" ")) {
  1055. ss = " ";
  1056. } else if (sku.contains(";")) {
  1057. ss = ";";
  1058. } else if (sku.contains(";")) {
  1059. ss = ";";
  1060. }
  1061. String[] CODE = getDistinctArray(sku.split(ss));
  1062. Rows rows = dbConnect.runSqlQuery("select t1.*,t2.stockno from st_stockbill t1 left join st_stock t2 on t1.stockid=t2.stockid where t1.st_stockbillid ='" + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  1063. if (rows.isEmpty()) {
  1064. return getErrReturnObject().setErrMsg("该出入库单不存在").toString();
  1065. }
  1066. Row st_stockbill = rows.get(0);
  1067. QuerySQL skuQuerySQL = SQLFactory.createQuerySQL(this, "sa_itemsku", "*");
  1068. skuQuerySQL.setTableAlias("t1");
  1069. skuQuerySQL.addJoinTable(JOINTYPE.left, "plm_item", "t2", "t1.itemid=t2.itemid", "itemno", "itemname", "model");
  1070. skuQuerySQL.addJoinTable(JOINTYPE.left, "st_stock", "t3", "t1.stockid=t3.stockid", "stockno");
  1071. skuQuerySQL.setWhere("t1.siteid", siteid);
  1072. skuQuerySQL.setWhere("t1.sku", CODE);
  1073. Rows skuRows = skuQuerySQL.query();
  1074. RowsMap skuRowsMap = skuRows.toRowsMap("sku");
  1075. if (st_stockbill_itemsid > 0 && dbConnect.runSqlQuery("select 1 from st_stockbill_items_sku where st_stockbillid=st_stockbill_itemsid and st_stockbillid=" + st_stockbillid).isNotEmpty()) {
  1076. scanqtyrefresh();
  1077. }
  1078. for (String FMACHINECODE : CODE) {
  1079. Rows stockbillitemsrows = dbConnect.runSqlQuery("select t1.itemid,t1.qty,t2.skucontrol,t1.st_stockbill_itemsid,t1.stockid from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid where t1.st_stockbillid ='" + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  1080. Rows stockbillitemskurows = dbConnect.runSqlQuery("select t1.*,t2.itemid from st_stockbill_items_sku t1 left join sa_itemsku t2 on t1.sku=t2.sku where t1.st_stockbillid ='" + st_stockbillid + "' and t1.siteid='" + siteid + "'");
  1081. SQLList sqllist = new SQLList();
  1082. if (FMACHINECODE.isEmpty()) {
  1083. continue;
  1084. }
  1085. if (st_stockbill.getString("type").contains("入库") && FMACHINECODE.startsWith("66")) {
  1086. return getErrReturnObject().setErrMsg("序列号" + FMACHINECODE + "不可在DRP手工入库").toString();
  1087. }
  1088. if (st_stockbill.getString("status").equals("审核") && stockbillitemskurows.size() == stockbillitemsrows.toRowsMap("skucontrol").get("1").sum("qty").intValue()) {
  1089. return getErrReturnObject().setErrMsg("序列号数量已经满足,不可继续添加").toString();
  1090. }
  1091. if (stockbillitemskurows.toArrayList("sku").contains(FMACHINECODE)) {
  1092. return getErrReturnObject().setErrMsg("序列号" + FMACHINECODE + "重复").toString();
  1093. }
  1094. if (!skuRowsMap.containsKey(FMACHINECODE)) {
  1095. return getErrReturnObject().setErrMsg("序列号" + FMACHINECODE + "不存在").toString();
  1096. } else {
  1097. if (skuRowsMap.get(FMACHINECODE).get(0).getString("status").equals("报废")) {
  1098. return getErrReturnObject().setErrMsg("该序列号已作废").toString();
  1099. }
  1100. long skustockid = skuRowsMap.get(FMACHINECODE).get(0).getLong("stockid");//序列号当前所在仓库
  1101. long skuitemid = skuRowsMap.get(FMACHINECODE).get(0).getLong("itemid");//序列号商品ID
  1102. String skuitemno = skuRowsMap.get(FMACHINECODE).get(0).getString("itemno");//商品编号
  1103. if (st_stockbill.getString("status").equals("审核")) {
  1104. Rows stockbillskucheckRows = dbConnect.runSqlQuery("select * from stockbillskucheck where itemid=" + skuitemid + " and st_stockbillid=" + st_stockbillid);
  1105. if (!stockbillskucheckRows.isEmpty()) {
  1106. return getErrReturnObject().setErrMsg("商品编号" + skuitemno + stockbillskucheckRows.get(0).getString("msg")).toString();
  1107. }
  1108. }
  1109. if (skustockid != 0 && isinstock(st_stockbill.getString("type"), st_stockbill.getString("rb"), true)) {
  1110. return getErrReturnObject().setErrMsg("序列号已在仓库中,不可进行入库操作").toString();
  1111. }
  1112. if (skustockid == 0 && !isinstock(st_stockbill.getString("type"), st_stockbill.getString("rb"), true)) {
  1113. return getErrReturnObject().setErrMsg("序列号不在仓库中,不可进行出库操作").toString();
  1114. }
  1115. if (skustockid == 0 && stockid == 0) {
  1116. return getErrReturnObject().setErrMsg("请指定仓库").toString();
  1117. }
  1118. if (st_stockbill.getString("status").equals("审核") && !stockbillitemsrows.toRowsMap("skucontrol").get("1").toRowsMap("itemid").containsKey(String.valueOf(skuitemid))) {
  1119. return getErrReturnObject().setErrMsg("当前单据已审核,所添加的序列号所属的商品编号没有包含在单据表体中").toString();
  1120. }
  1121. if (st_stockbill.getString("type").equals("生产入库") && skuRowsMap.get("FMACHINECODE").get(0).getString("mono").isEmpty()) {
  1122. return getErrReturnObject().setErrMsg("序列号非生产订单生成,不可添加").toString();
  1123. }
  1124. if (stockid != 0) {//如果指定了仓库,则使用指定的仓库
  1125. skustockid = stockid;
  1126. }
  1127. //插入序列号
  1128. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items_sku");
  1129. insertSQL.setSiteid(siteid);
  1130. insertSQL.setValue("stockid", skustockid);
  1131. insertSQL.setValue("itemid", skuitemid);
  1132. insertSQL.setValue("sku", FMACHINECODE);
  1133. RowsMap stockbillitemsrowsMap = stockbillitemsrows.toRowsMap("itemid");
  1134. if (st_stockbill.getString("status").equals("新建")) {
  1135. if (st_stockbill_itemsid == 0) {//没有指定单据表体ID,自动匹配,如果找不到则新增表体行
  1136. if (!stockbillitemsrowsMap.containsKey(String.valueOf(skuitemid)) || !stockbillitemsrowsMap.get(String.valueOf(skuitemid)).toRowsMap("stockid").containsKey(String.valueOf(skustockid))) {
  1137. //如果序列号所属商品不在单据表体中或仓库不同,则添加
  1138. InsertSQL insertdetailSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items");
  1139. insertdetailSQL.setSiteid(siteid);
  1140. insertdetailSQL.setValue("rowno", 1);
  1141. insertdetailSQL.setValue("sa_dispatch_itemsid", 0);
  1142. insertdetailSQL.setValue("stockid", skustockid);
  1143. insertdetailSQL.setValue("itemid", skuitemid);
  1144. insertdetailSQL.setValue("itemno", skuRowsMap.get(FMACHINECODE).get(0).getString("itemno"));
  1145. insertdetailSQL.setValue("itemname", skuRowsMap.get(FMACHINECODE).get(0).getString("itemname"));
  1146. insertdetailSQL.setValue("model", skuRowsMap.get(FMACHINECODE).get(0).getString("model"));
  1147. insertdetailSQL.setValue("qty", 1);
  1148. insertdetailSQL.setValue("sku", FMACHINECODE);
  1149. insertdetailSQL.setValue("skucontrol", 1);
  1150. insertdetailSQL.setValue("st_stockbillid", st_stockbillid);
  1151. sqllist.add(insertdetailSQL.getSQL());
  1152. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1153. insertSQL.setValue("st_stockbill_itemsid", insertdetailSQL.getUniqueid());
  1154. } else {
  1155. long stockbill_itemsid = stockbillitemsrows.toRowsMap("itemid").get(skuitemid).toRowsMap("stockid").get(String.valueOf(skustockid)).get(0).getLong("st_stockbill_itemsid");
  1156. if (stockbillitemsrowsMap.get(String.valueOf(skuitemid)).toRowsMap("stockid").get(String.valueOf(skustockid)).sum("qty").compareTo(BigDecimal.valueOf(stockbillitemskurows.toRowsMap("itemid").get(skuitemid).toRowsMap("stockid").get(String.valueOf(skustockid)).size())) <= 0) {
  1157. BigDecimal newqty = BigDecimal.valueOf(stockbillitemskurows.toRowsMap("itemid").get(skuitemid).toRowsMap("stockid").get(String.valueOf(skustockid)).size()).subtract(stockbillitemsrows.toRowsMap("itemid").get(skuitemid).toRowsMap("stockid").get(String.valueOf(skustockid)).sum("qty")).add(BigDecimal.ONE);
  1158. sqllist.add("update st_stockbill_items set qty=qty+" + newqty + " where st_stockbill_itemsid =" + stockbill_itemsid);
  1159. }
  1160. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1161. insertSQL.setValue("st_stockbill_itemsid", stockbill_itemsid);
  1162. }
  1163. } else {
  1164. if (stockbillitemsrows.toRowsMap("st_stockbill_itemsid").get("st_stockbill_itemsid").sum("qty").compareTo(stockbillitemskurows.toRowsMap("st_stockbill_itemsid").get(st_stockbill_itemsid).sum("qty")) <= 0) {
  1165. int newqty = stockbillitemskurows.toRowsMap("st_stockbill_itemsid").get(st_stockbill_itemsid).size() + 1;
  1166. sqllist.add("update st_stockbill_items set qty=" + newqty + " where st_stockbill_itemsid =" + st_stockbill_itemsid);
  1167. }
  1168. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1169. insertSQL.setValue("st_stockbill_itemsid", st_stockbill_itemsid);
  1170. }
  1171. } else {
  1172. if (st_stockbill_itemsid == 0) {
  1173. if (stockbillitemsrows.toRowsMap("itemid").get(skuitemid).toRowsMap("stockid").get(skustockid).sum("qty").compareTo(stockbillitemskurows.toRowsMap("itemid").get(skuitemid).toRowsMap("stockid").get(skustockid).sum("qty")) == 0) {
  1174. return getErrReturnObject().setErrMsg("序列号数量已经满足,不可继续添加").toString();
  1175. } else {
  1176. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1177. insertSQL.setValue("st_stockbill_itemsid", st_stockbillid);
  1178. }
  1179. } else {
  1180. if (stockbillitemsrows.toRowsMap("st_stockbill_itemsid").get(st_stockbill_itemsid).sum("qty").compareTo(stockbillitemskurows.toRowsMap("st_stockbill_itemsid").get(st_stockbill_itemsid).sum("qty")) == 0) {
  1181. return getErrReturnObject().setErrMsg("序列号数量已经满足,不可继续添加").toString();
  1182. } else {
  1183. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1184. insertSQL.setValue("st_stockbill_itemsid", st_stockbill_itemsid);
  1185. }
  1186. }
  1187. }
  1188. sqllist.add(insertSQL.getSQL());
  1189. if (st_stockbill.getString("status").equals("审核")) {
  1190. if (isinstock(st_stockbill.getString("type"), st_stockbill.getString("rb"), true)) {
  1191. sqllist.add("update sa_itemsku set stockid=" + skustockid + " where sku='" + FMACHINECODE + "'");
  1192. if (st_stockbill.getString("type").equals("销售出库")) {
  1193. sqllist.add("update sa_itemsku set sa_agentsid=0,sys_enterpriseid=0 where sku='" + FMACHINECODE + "'");
  1194. }
  1195. } else {
  1196. sqllist.add("update sa_itemsku set stockid=0 where sku='" + FMACHINECODE + "'");
  1197. if (st_stockbill.getString("type").equals("销售出库")) {
  1198. sqllist.add("update sa_itemsku set sys_enterpriseid=" + st_stockbill.getLong("sys_enterpriseid") + ",sa_agentsid=(select sa_agentsid from sa_agents where sys_enterpriseid=" + st_stockbill.getLong("sys_enterpriseid") + ") where sku='" + FMACHINECODE + "'");
  1199. if (st_stockbill.getBoolean("iswx")) {
  1200. sqllist.add("update sa_itemsku set stockid=(select stockid from st_stock where stockno='00') where sku='" + FMACHINECODE + "'");
  1201. }
  1202. }
  1203. }
  1204. }
  1205. }
  1206. dbConnect.runSqlUpdate(sqllist);
  1207. }
  1208. return getSucReturnObject().toString();
  1209. }
  1210. @API(title = "扫描数量刷新", apiversion = R.ID2025102215584903.v1.class)
  1211. @CACHEING_CLEAN(apiClass = {
  1212. stockbill.class,
  1213. stockbillitems.class,
  1214. stockbillitemssku.class})
  1215. public String scanqtyrefresh() throws YosException {
  1216. long st_stockbillid = content.getLong("st_stockbillid");
  1217. SQLList sqllist = new SQLList();
  1218. Rows stockbillskuRows = dbConnect.runSqlQuery("select t1.sku,t2.itemid,t1.st_stockbill_items_skuid from st_stockbill_items_sku t1 left join sa_itemsku t2 on t1.sku=t2.sku where t1.st_stockbillid=t1.st_stockbill_itemsid and t1.st_stockbillid=" + st_stockbillid);
  1219. Rows stockbilldetailRows = dbConnect.runSqlQuery("select t1.itemid,t1.st_stockbill_itemsid,(t1.qty-ifnull(t2.smqty,0)) qty from st_stockbill_items t1 left join (select st_stockbill_itemsid,count(1) smqty from st_stockbill_items_sku where st_stockbillid='" + st_stockbillid + "' and st_stockbillid!=st_stockbill_itemsid group by st_stockbill_itemsid) t2 on t1.st_stockbill_itemsid=t2.st_stockbill_itemsid where t1.st_stockbillid=" + st_stockbillid + " and skucontrol=1");
  1220. RowsMap stockbilldetailRowsMap = stockbilldetailRows.toRowsMap("itemid");
  1221. HashMap<String, Integer> itemqtymap = new HashMap<>();
  1222. for (Row row : stockbillskuRows) {
  1223. String itemid = row.getString("itemid");
  1224. if (itemqtymap.containsKey(itemid)) {
  1225. itemqtymap.put(itemid, itemqtymap.get(itemid) + 1);
  1226. } else {
  1227. itemqtymap.put(itemid, 1);
  1228. }
  1229. long st_stockbill_items_skuid = row.getLong("st_stockbill_items_skuid");
  1230. if (stockbilldetailRowsMap.containsKey(itemid)) {
  1231. for (Row rowdetail : stockbilldetailRowsMap.get(itemid)) {
  1232. if (rowdetail.getInteger("qty") >= itemqtymap.get(itemid)) {
  1233. sqllist.add("update st_stockbill_items_sku set st_stockbill_itemsid=" + rowdetail.getLong("st_stockbill_itemsid") + " where st_stockbill_items_skuid=" + st_stockbill_items_skuid);
  1234. break;
  1235. }
  1236. }
  1237. }
  1238. }
  1239. dbConnect.runSqlUpdate(sqllist);
  1240. return getSucReturnObject().toString();
  1241. }
  1242. @API(title = "批量建快递信息单", apiversion = R.ID2025110810253603.v1.class)
  1243. public String insertexpressforms() throws YosException {
  1244. SQLList sqlList = new SQLList();
  1245. // 表名
  1246. String tableName = "expressform";
  1247. long expresssdrid = content.getLong("expresssdrid");
  1248. String province = content.getStringValue("province");
  1249. String city = content.getStringValue("city");
  1250. String county = content.getStringValue("county");
  1251. String phonenumber = content.getStringValue("phonenumber");
  1252. String address = content.getStringValue("address");
  1253. BigDecimal agencyfund = content.getBigDecimal("agencyfund");
  1254. String ordertype = content.getStringValue("ordertype");
  1255. JSONArray st_stockbillids = content.getJSONArray("st_stockbillids");
  1256. QuerySQL stockbillQuerySQL = SQLFactory.createQuerySQL(this, "st_stockbill", "*");
  1257. stockbillQuerySQL.setTableAlias("t1");
  1258. stockbillQuerySQL.addQueryFields("rev_name", "t1.name");
  1259. stockbillQuerySQL.addQueryFields("rcv_phone", "t1.phonenumber");
  1260. stockbillQuerySQL.addQueryFields("rcv_mobile", "t1.phonenumber");
  1261. stockbillQuerySQL.addQueryFields("rcv_address", "t1.address");
  1262. stockbillQuerySQL.setWhere("t1.siteid", siteid);
  1263. stockbillQuerySQL.setWhere("t1.st_stockbillid", st_stockbillids);
  1264. stockbillQuerySQL.setWhere("t1.type='销售出库'");
  1265. Rows stockbillRows = stockbillQuerySQL.query();
  1266. QuerySQL orderQuerySQL = SQLFactory.createQuerySQL(this, "sa_order", "province", "city", "county");
  1267. orderQuerySQL.setTableAlias("t1");
  1268. orderQuerySQL.addJoinTable(JOINTYPE.inner, "sa_orderitems", "t2", "t2.sa_orderid=t1.sa_orderid");
  1269. orderQuerySQL.addJoinTable(JOINTYPE.inner, "st_stockbill_items", "t3", "t3.sa_orderitemsid=t2.sa_orderitemsid", "st_stockbillid");
  1270. orderQuerySQL.setWhere("t3.st_stockbillid", st_stockbillids);
  1271. Rows orderRows = orderQuerySQL.query();
  1272. RowsMap orderrowsMap = orderRows.toRowsMap("st_stockbillid");
  1273. for (Row row : stockbillRows) {
  1274. long expressformid = createTableID(tableName);
  1275. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, tableName);
  1276. insertSQL.setUniqueid(expressformid);
  1277. insertSQL.setSiteid(siteid);
  1278. insertSQL.setValue("logisticproviderid", "YTO");
  1279. insertSQL.setValue("ordertype", ordertype);
  1280. insertSQL.setValue("agencyfund", agencyfund);
  1281. insertSQL.setValue("itemname", "配件");
  1282. insertSQL.setValue("number", 1);
  1283. insertSQL.setValue("fpriority_ads", "配件>常规");
  1284. insertSQL.setValue("sys_enterpriseid", row.getLong("sys_enterpriseid"));
  1285. insertSQL.setValue("rcv_name", row.getString("rev_name"));
  1286. insertSQL.setValue("rcv_phone", row.getString("rcv_phone"));
  1287. insertSQL.setValue("rcv_mobile", row.getString("rcv_mobile"));
  1288. insertSQL.setValue("rcv_postcode", "");
  1289. insertSQL.setValue("rcv_prov", orderrowsMap.containsKey(row.getString("st_stockbillid")) ? orderrowsMap.get(row.getString("st_stockbillid")).get(0).getString("province") : province);
  1290. insertSQL.setValue("rcv_city", orderrowsMap.containsKey(row.getString("st_stockbillid")) ? orderrowsMap.get(row.getString("st_stockbillid")).get(0).getString("city") : city);
  1291. insertSQL.setValue("rcv_county", orderrowsMap.containsKey(row.getString("st_stockbillid")) ? orderrowsMap.get(row.getString("st_stockbillid")).get(0).getString("county") : city);
  1292. insertSQL.setValue("rcv_address", row.getString("rcv_address"));
  1293. insertSQL.setValue("expresssdrid", expresssdrid);
  1294. insertSQL.setValue("remarks", "");
  1295. insertSQL.setValue("mailno", "");
  1296. insertSQL.setValue("province", province);
  1297. insertSQL.setValue("city", city);
  1298. insertSQL.setValue("county", county);
  1299. insertSQL.setValue("phonenumber", phonenumber);
  1300. insertSQL.setValue("address", address);
  1301. insertSQL.setValue("txlogisticid", createBillCode("logisticsbill"));
  1302. insertSQL.setValue("createby", username);
  1303. insertSQL.setDateValue("createdate");
  1304. insertSQL.setValue("changeby", username);
  1305. insertSQL.setDateValue("changedate");
  1306. insertSQL.setValue("status", "新建");
  1307. sqlList.add(insertSQL.getSQL());
  1308. sqlList.add(DataContrlLog.createLog(this, "expressform", expressformid, "新增", "快递信息新增成功").getSQL());
  1309. InsertSQL insertBindSQL = SQLFactory.createInsertSQL(this, "sa_expressform_stockbill");
  1310. insertBindSQL.setUniqueid(createTableID("sa_expressform_stockbill"));
  1311. insertBindSQL.setSiteid(siteid);
  1312. insertBindSQL.setValue("st_stockbillid", row.getLong("st_stockbillid"));
  1313. insertBindSQL.setValue("expressformid", expressformid);
  1314. sqlList.add(insertBindSQL.getSQL());
  1315. }
  1316. dbConnect.runSqlUpdate(sqlList);
  1317. return getSucReturnObject().toString();
  1318. }
  1319. @API(title = "更新站点信息详情详情", apiversion = R.ID20230720143503.v1.class)
  1320. public String updateParameterSiteInfo() throws YosException {
  1321. BigDecimal icstockbillrebaterate = content.getBigDecimal("icstockbillrebaterate");
  1322. Long icstockbillrebateaccount = content.getLong("icstockbillrebateaccount");
  1323. dbConnect.runSqlUpdate("update sys_site_parameter set icstockbillrebaterate='" + icstockbillrebaterate + "',icstockbillrebateaccount='" + icstockbillrebateaccount + "' where siteid='" + siteid + "'");
  1324. return getSucReturnObject().toString();
  1325. }
  1326. @API(title = "站点信息详情", apiversion = R.ID20230720143603.v1.class)
  1327. public String queryParameterSiteInfo() throws YosException {
  1328. Rows rows = dbConnect.runSqlQuery("select icstockbillrebateaccount,icstockbillrebaterate from sys_site_parameter where siteid='" + siteid + "'");
  1329. Row row = rows.isNotEmpty() ? rows.get(0) : new Row();
  1330. return getSucReturnObject().setData(row).toString();
  1331. }
  1332. @API(title = "下载销售出库单导入单模板", apiversion = R.ID2025111309451103.v1.class)
  1333. public String downloadstockbillExcel() throws YosException {
  1334. ExcelFactory excelFactory = new ExcelFactory("ImportTemplateForStockbill");
  1335. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet("Sheet1");
  1336. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  1337. CellStyle style = xssfFWorkbook.createCellStyle();
  1338. // 设置为文本格式,防止身份证号变成科学计数法
  1339. DataFormat format = xssfFWorkbook.createDataFormat();
  1340. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1341. style.setDataFormat(format.getFormat("@"));
  1342. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1343. for (int i = 0; i <= 13; i++) {
  1344. sheet.setDefaultColumnStyle(i, style);
  1345. }
  1346. ExportExcelSpecial.setBatchDetailSheetColumn1(sheet);// 设置工作薄列宽
  1347. XSSFCellStyle titleCellStyle1 = ExportExcelSpecial.createTitleCellStyle1(xssfFWorkbook);
  1348. XSSFCellStyle titleCellStyle2 = ExportExcelSpecial.createTitleCellStyle2(xssfFWorkbook);
  1349. XSSFCellStyle titleCellStyle3 = ExportExcelSpecial.createTitleCellStyle3(xssfFWorkbook);
  1350. XSSFCellStyle titleCellStyle4 = ExportExcelSpecial.createBodyCellStyle4(xssfFWorkbook);
  1351. ExportExcelSpecial.batchDetail(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, titleCellStyle4, xssfFWorkbook);// 写入标题
  1352. Rows aa = saveToExcelAttachment(excelFactory);
  1353. String url = "";
  1354. if (!aa.isEmpty()) {
  1355. url = aa.get(0).getString("url");
  1356. }
  1357. return getSucReturnObject().setData(url).toString();
  1358. }
  1359. @API(title = "导入销售出库单", apiversion = R.ID2025111309451703.v1.class)
  1360. @CACHEING_CLEAN(apiClass = {
  1361. stockbill.class,
  1362. stockbillitems.class,
  1363. stockbillitemssku.class})
  1364. public String uploadstockbillByExcel() throws YosException {
  1365. SQLList sqlList = new SQLList();
  1366. ExcelFactory e;
  1367. try {
  1368. if (content.getLongValue("attachmentid") > 0) {
  1369. e = getExcelAttachment(content.getLongValue("attachmentid"));
  1370. // 本地
  1371. //e = getPostExcelFactory();
  1372. } else {
  1373. e = getPostExcel();
  1374. // 本地
  1375. //e = getPostExcelFactory();
  1376. }
  1377. ArrayList<String> keys = new ArrayList<>();
  1378. keys.add("type");
  1379. keys.add("depno");
  1380. keys.add("agentnum");
  1381. keys.add("remarks");
  1382. keys.add("payamount");
  1383. keys.add("paydiscountamount");
  1384. keys.add("outplace");
  1385. keys.add("rb");
  1386. keys.add("itemno");
  1387. keys.add("stockno");
  1388. keys.add("qty");
  1389. keys.add("defaultprice");
  1390. keys.add("discountrate");
  1391. Rows rows = e.getSheetRows(0, keys, 3);
  1392. boolean iserr = false;
  1393. Rows rowserr = new Rows();
  1394. Rows rowssuc = new Rows();
  1395. RowsMap stockRowsMap = SQLFactory.createQuerySQL(this, "st_stock", "stockid", "stockno").query().toRowsMap("stockno");
  1396. RowsMap depRowsMap = SQLFactory.createQuerySQL(this, "sys_department", "departmentid", "depno").query().toRowsMap("depno");
  1397. QuerySQL agentquerySQL = SQLFactory.createQuerySQL(this, "sa_agents", "agentnum", "sys_enterpriseid");
  1398. agentquerySQL.setTableAlias("t1");
  1399. agentquerySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_contacts", "t2", "t1.sys_enterpriseid=t2.sys_enterpriseid", "contactsid", "name", "phonenumber");
  1400. agentquerySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_finance", "t3", "t1.sys_enterpriseid=t3.sys_enterpriseid", "enterprisename", "taxno", "address");
  1401. agentquerySQL.setSiteid(siteid);
  1402. agentquerySQL.setWhere("t1.agentnum", rows.toArrayList("agentnum"));
  1403. Rows agentsRows = agentquerySQL.query();
  1404. RowsMap agentsRowsMap = agentsRows.toRowsMap("agentnum");
  1405. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "plm_item", "itemid", "itemno", "itemname", "model", "skucontrol");
  1406. querySQL.setTableAlias("t1");
  1407. querySQL.setSiteid(siteid);
  1408. querySQL.setWhere("t1.itemno", rows.toArrayList("itemno"));
  1409. Rows itemrows = querySQL.query();
  1410. RowsMap itemRowsMap = itemrows.toRowsMap("itemno");
  1411. for (Row row : rows) {
  1412. if (!(StringUtils.isBlank(row.getString("type")) && StringUtils.isBlank(row.getString("depno")) && StringUtils.isBlank(row.getString("agentnum")) && StringUtils.isBlank(row.getString("remarks")) && StringUtils.isBlank(row.getString("payamount")) && StringUtils.isBlank(row.getString("paydiscountamount")) && StringUtils.isBlank(row.getString("outplace")) && StringUtils.isBlank(row.getString("rb")))) {
  1413. if (StringUtils.isBlank(row.getString("type")) || StringUtils.isBlank(row.getString("rb")) || StringUtils.isBlank(row.getString("outplace")) || StringUtils.isBlank(row.getString("agentnum"))) {
  1414. iserr = true;
  1415. row.put("msg", "错误信息:类型/红蓝字/发货地/经销商编码不能为空");
  1416. rowserr.add(row);
  1417. continue;
  1418. }
  1419. if (!agentsRowsMap.containsKey(row.getString("agentnum"))) {
  1420. iserr = true;
  1421. row.put("msg", "错误信息:经销商编号不存在");
  1422. rowserr.add(row);
  1423. continue;
  1424. }
  1425. if (!row.getString("rb").equals("红") && !row.getString("rb").equals("蓝")) {
  1426. iserr = true;
  1427. row.put("msg", "错误信息:红蓝字只能填写红或蓝");
  1428. rowserr.add(row);
  1429. continue;
  1430. }
  1431. if (!row.getString("outplace").equals("谈桥") && !row.getString("outplace").equals("马桥")) {
  1432. iserr = true;
  1433. row.put("msg", "错误信息:发货地只能填写谈桥或马桥");
  1434. rowserr.add(row);
  1435. continue;
  1436. }
  1437. if (!row.getString("type").equals("销售出库") && !row.getString("outplace").equals("其他入库") && !row.getString("outplace").equals("其他出库")) {
  1438. iserr = true;
  1439. row.put("msg", "错误信息:出入库单类型错误");
  1440. rowserr.add(row);
  1441. continue;
  1442. }
  1443. if (!itemRowsMap.containsKey(row.getString("itemno"))) {
  1444. iserr = true;
  1445. row.put("msg", "错误信息:品号不存在");
  1446. rowserr.add(row);
  1447. continue;
  1448. }
  1449. if (!isNumeric(row.getString("paydiscountamount"))) {
  1450. iserr = true;
  1451. row.put("msg", "优惠金额不为数字格式,请检查");
  1452. rowserr.add(row);
  1453. continue;
  1454. }
  1455. if (!isNumeric(row.getString("payamount"))) {
  1456. iserr = true;
  1457. row.put("msg", "扣款金额不为数字格式,请检查");
  1458. rowserr.add(row);
  1459. continue;
  1460. }
  1461. if (!isNumeric(row.getString("qty"))) {
  1462. iserr = true;
  1463. row.put("msg", "数量不为数字格式,请检查");
  1464. rowserr.add(row);
  1465. continue;
  1466. }
  1467. if (!isNumeric(row.getString("defaultprice"))) {
  1468. iserr = true;
  1469. row.put("msg", "原价不为数字格式,请检查");
  1470. rowserr.add(row);
  1471. continue;
  1472. }
  1473. if (!isNumeric(row.getString("discountrate"))) {
  1474. iserr = true;
  1475. row.put("msg", "折扣率不为数字格式,请检查");
  1476. rowserr.add(row);
  1477. continue;
  1478. } else {
  1479. if (row.getDouble("discountrate") > 1) {
  1480. iserr = true;
  1481. row.put("msg", "折扣率不能大于1,请检查");
  1482. rowserr.add(row);
  1483. continue;
  1484. }
  1485. }
  1486. } else {
  1487. if (!itemRowsMap.containsKey(row.getString("itemno"))) {
  1488. iserr = true;
  1489. row.put("msg", "错误信息:品号不存在");
  1490. rowserr.add(row);
  1491. continue;
  1492. }
  1493. if (!isNumeric(row.getString("qty"))) {
  1494. iserr = true;
  1495. row.put("msg", "数量不为数字格式,请检查");
  1496. rowserr.add(row);
  1497. continue;
  1498. }
  1499. if (!isNumeric(row.getString("defaultprice"))) {
  1500. iserr = true;
  1501. row.put("msg", "原价不为数字格式,请检查");
  1502. rowserr.add(row);
  1503. continue;
  1504. }
  1505. if (!isNumeric(row.getString("discountrate"))) {
  1506. iserr = true;
  1507. row.put("msg", "折扣率不为数字格式,请检查");
  1508. rowserr.add(row);
  1509. continue;
  1510. } else {
  1511. if (row.getDouble("discountrate") > 1) {
  1512. iserr = true;
  1513. row.put("msg", "折扣率不能大于1,请检查");
  1514. rowserr.add(row);
  1515. continue;
  1516. }
  1517. }
  1518. }
  1519. rowssuc.add(row);
  1520. }
  1521. Rows rowsResult = new Rows();
  1522. Rows rowsdetail = new Rows();
  1523. Row rowresult = new Row();
  1524. int i = 0;
  1525. for (Row row : rowssuc) {
  1526. if (StringUtils.isNotBlank(row.getString("agentnum")) && StringUtils.isNotBlank(row.getString("type")) && StringUtils.isNotBlank(row.getString("rb")) && StringUtils.isNotBlank(row.getString("outplace"))) {
  1527. rowresult.put("iteminfos", rowsdetail);
  1528. rowsResult.add(rowresult);
  1529. rowresult = new Row();
  1530. rowresult.put("type", row.getString("type"));
  1531. rowresult.put("depno", row.getString("depno"));
  1532. rowresult.put("agentnum", row.getString("agentnum"));
  1533. rowresult.put("remarks", row.getString("remarks"));
  1534. rowresult.put("payamount", StringUtils.isNotBlank(row.getString("payamount")) ? row.getDouble("payamount") : 0);
  1535. rowresult.put("paydiscountamount", StringUtils.isNotBlank(row.getString("paydiscountamount")) ? row.getDouble("paydiscountamount") : 0);
  1536. rowresult.put("rb", row.getString("rb"));
  1537. rowresult.put("outplace", row.getString("outplace"));
  1538. rowsdetail = new Rows();
  1539. Row rowdetail = new Row();
  1540. rowdetail.put("itemno", row.getString("itemno"));
  1541. rowdetail.put("stockno", row.getString("stockno"));
  1542. rowdetail.put("qty", row.getString("qty"));
  1543. rowdetail.put("defaultprice", row.getString("defaultprice"));
  1544. rowdetail.put("discountrate", row.getString("discountrate"));
  1545. rowsdetail.add(rowdetail);
  1546. } else {
  1547. Row rowdetail = new Row();
  1548. rowdetail.put("itemno", row.getString("itemno"));
  1549. rowdetail.put("stockno", row.getString("stockno"));
  1550. rowdetail.put("qty", row.getString("qty"));
  1551. rowdetail.put("defaultprice", row.getString("defaultprice"));
  1552. rowdetail.put("discountrate", row.getString("discountrate"));
  1553. rowsdetail.add(rowdetail);
  1554. }
  1555. i++;
  1556. if (i == rows.size()) {
  1557. rowresult.put("iteminfos", rowsdetail);
  1558. rowsResult.add(rowresult);
  1559. }
  1560. }
  1561. if (iserr) {
  1562. ExcelFactory excelFactory = new ExcelFactory("出入库单导入错误信息");
  1563. HashMap<String, String> map = new HashMap<String, String>();
  1564. map.put("type", "类型");
  1565. map.put("depno", "部门编号");
  1566. map.put("agentnum", "经销商编号");
  1567. map.put("remarks", "备注");
  1568. map.put("payamount", "扣款金额");
  1569. map.put("paydiscountamount", "优惠金额");
  1570. map.put("outplace", "发货地");
  1571. map.put("rb", "红蓝字");
  1572. map.put("itemno", "品号");
  1573. map.put("stockno", "仓库编号");
  1574. map.put("qty", "数量");
  1575. map.put("defaultprice", "原价");
  1576. map.put("discountrate", "折扣率");
  1577. map.put("msg", "错误信息");
  1578. ArrayList<String> colNameList = new ArrayList<String>();
  1579. HashMap<String, Class> keytypemap = new HashMap<String, Class>();
  1580. colNameList.add("type");
  1581. colNameList.add("depno");
  1582. colNameList.add("agentnum");
  1583. colNameList.add("remarks");
  1584. colNameList.add("payamount");
  1585. colNameList.add("paydiscountamount");
  1586. colNameList.add("outplace");
  1587. colNameList.add("rb");
  1588. colNameList.add("itemno");
  1589. colNameList.add("stockno");
  1590. colNameList.add("qty");
  1591. colNameList.add("defaultprice");
  1592. colNameList.add("discountrate");
  1593. colNameList.add("msg");
  1594. keytypemap.put("type", String.class);
  1595. keytypemap.put("depno", String.class);
  1596. keytypemap.put("agentnum", String.class);
  1597. keytypemap.put("remarks", String.class);
  1598. keytypemap.put("payamount", String.class);
  1599. keytypemap.put("paydiscountamount", String.class);
  1600. keytypemap.put("outplace", String.class);
  1601. keytypemap.put("rb", String.class);
  1602. keytypemap.put("itemno", String.class);
  1603. keytypemap.put("stockno", String.class);
  1604. keytypemap.put("qty", String.class);
  1605. keytypemap.put("defaultprice", String.class);
  1606. keytypemap.put("discountrate", String.class);
  1607. keytypemap.put("msg", String.class);
  1608. rowserr.setFieldList(colNameList);
  1609. rowserr.setFieldTypeMap(keytypemap);
  1610. addSheet(excelFactory, "Sheet1", rowserr, map);
  1611. Rows aa = saveToExcelAttachment(excelFactory);
  1612. String url = "";
  1613. if (!aa.isEmpty()) {
  1614. url = aa.get(0).getString("url");
  1615. }
  1616. return getSucReturnObject().setData(url).toString();
  1617. }
  1618. if (!rowsResult.isEmpty()) {
  1619. int a = 0;
  1620. for (Row row : rowsResult) {
  1621. if (a == 0) {
  1622. a++;
  1623. continue;
  1624. }
  1625. long st_stockbillid = createTableID("st_stockbill");
  1626. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill");
  1627. insertSQL.setUniqueid(st_stockbillid);
  1628. insertSQL.setSiteid(siteid);
  1629. insertSQL.setValue("sys_enterpriseid", agentsRowsMap.get(row.getString("agentnum")).get(0).getLong("sys_enterpriseid"));
  1630. insertSQL.setValue("rec_contactsid", agentsRowsMap.get(row.getString("agentnum")).get(0).getLong("contactsid"));
  1631. insertSQL.setValue("departmentid", depRowsMap.containsKey(row.getString("depno")) ? depRowsMap.get(row.getString("depno")).get(0).getLong("departmentid") : 0);
  1632. insertSQL.setValue("stockid", 0);
  1633. insertSQL.setValue("type", "销售出库");
  1634. insertSQL.setValue("typemx", "");
  1635. insertSQL.setValue("sa_supplierid", 0);
  1636. insertSQL.setValue("rb", 1);
  1637. insertSQL.setValue("remarks", row.getString("remarks"));
  1638. insertSQL.setDateValue("billdate");
  1639. insertSQL.setValue("billno", createBillCode("stockbill"));
  1640. insertSQL.setValue("outplace", row.getString("outplace"));
  1641. insertSQL.setValue("delivery", "到付");
  1642. insertSQL.setValue("invoice_enterprisename", agentsRowsMap.get(row.getString("agentnum")).get(0).getString("enterprisename"));
  1643. insertSQL.setValue("invoice_address", agentsRowsMap.get(row.getString("agentnum")).get(0).getString("address"));
  1644. insertSQL.setValue("invoice_taxno", agentsRowsMap.get(row.getString("agentnum")).get(0).getString("taxno"));
  1645. insertSQL.setValue("tracknumber", "");
  1646. insertSQL.setValue("isconfirm", 0);
  1647. insertSQL.setValue("period", getDate_Str().substring(0, 7));
  1648. insertSQL.setValue("createby", username);
  1649. insertSQL.setDateValue("createdate");
  1650. insertSQL.setValue("changeby", username);
  1651. insertSQL.setDateValue("changedate");
  1652. insertSQL.setValue("status", "新建");
  1653. insertSQL.setValue("payamount", row.getDouble("payamount"));
  1654. insertSQL.setValue("paydiscountamount", row.getDouble("paydiscountamount"));
  1655. sqlList.add(insertSQL.getSQL());
  1656. sqlList.add(DataContrlLog.createLog(this, "st_stockbill", st_stockbillid, "新增", "销售出库单新增成功").getSQL());
  1657. int j = 1;
  1658. BigDecimal payamount = BigDecimal.ZERO;
  1659. for (Row rowdetail : row.getRows("iteminfos")) {
  1660. payamount = payamount.add(row.getBigDecimal("undeliqty").multiply(row.getBigDecimal("price")));
  1661. insertSQL = SQLFactory.createInsertSQL(this, "st_stockbill_items");
  1662. insertSQL.setUniqueid(createTableID("st_stockbill_items"));
  1663. insertSQL.setSiteid(siteid);
  1664. insertSQL.setValue("rowno", j);
  1665. insertSQL.setValue("st_stockbillid", st_stockbillid);
  1666. insertSQL.setValue("sa_orderitemsid", 0);
  1667. insertSQL.setValue("itemid", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getLong("itemid"));
  1668. insertSQL.setValue("sa_orderid", 0);
  1669. insertSQL.setValue("stockid", stockRowsMap.get(rowdetail.getString("stockno")).get(0).getLong("stockid"));
  1670. insertSQL.setValue("qty", rowdetail.getDouble("qty"));
  1671. insertSQL.setValue("discountrate", rowdetail.getDouble("discountrate"));
  1672. insertSQL.setValue("sa_dispatch_itemsid", 0);
  1673. insertSQL.setValue("defaultprice", rowdetail.getDouble("defaultprice"));
  1674. insertSQL.setValue("remarks", "");
  1675. insertSQL.setValue("itemno", rowdetail.getString("itemno"));
  1676. insertSQL.setValue("itemname", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getString("itemname"));
  1677. insertSQL.setValue("model", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getString("model"));
  1678. insertSQL.setValue("price", new BigDecimal(rowdetail.getDouble("defaultprice")).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))));
  1679. insertSQL.setValue("amount", new BigDecimal(rowdetail.getDouble("defaultprice")).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))).multiply(new BigDecimal(rowdetail.getDouble("qty"))));
  1680. insertSQL.setValue("untaxedprice", new BigDecimal(rowdetail.getDouble("defaultprice")).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))).divide(new BigDecimal(1.13), 2, BigDecimal.ROUND_HALF_UP));
  1681. insertSQL.setValue("untaxedamount", new BigDecimal(rowdetail.getDouble("qty")).multiply(new BigDecimal(rowdetail.getDouble("defaultprice"))).multiply(new BigDecimal(rowdetail.getDouble("discountrate"))).divide(new BigDecimal(1.13), 2, BigDecimal.ROUND_HALF_UP));
  1682. insertSQL.setValue("skucontrol", itemRowsMap.get(rowdetail.getString("itemno")).get(0).getBoolean("skucontrol"));
  1683. j++;
  1684. sqlList.add(insertSQL.getSQL());
  1685. }
  1686. }
  1687. }
  1688. if (!sqlList.isEmpty()) {
  1689. System.err.println(sqlList.toString());
  1690. dbConnect.runSqlUpdate(sqlList);
  1691. }
  1692. } catch (Exception e1) {
  1693. e1.printStackTrace();
  1694. return getErrReturnObject().setErrMsg(e1.getMessage()).toString();
  1695. }
  1696. return getSucReturnObject().toString();
  1697. }
  1698. public CashbillEntity getCashbillEntity(String billdate, BigDecimal amount, BigDecimal discountamount, Long ownerid, String source, String sourcenotes, String remarks) throws YosException {
  1699. CashbillEntity entity = new CashbillEntity(billdate);
  1700. entity.setAmount(amount);
  1701. entity.setDiscountamountamount(discountamount);
  1702. entity.setOwnerid(ownerid);
  1703. entity.setOwnertable("st_stockbill");
  1704. entity.setSource(source);
  1705. entity.setRemarks(remarks);
  1706. entity.setSourcenote(sourcenotes);
  1707. return entity;
  1708. }
  1709. /**
  1710. * @param type
  1711. * @param rb
  1712. * @param fischeck
  1713. * @return
  1714. */
  1715. public boolean isinstock(String type, String rb, boolean fischeck) {
  1716. if (type.equals("其他出库") || type.equals("销售出库") || type.equals("生产领料出库") || type.equals("委外领料出库") || type.equals("返修出库")) {
  1717. if ((fischeck && rb.equals("1")) || (!fischeck && rb.equals("0"))) {
  1718. return false;
  1719. } else {
  1720. return true;
  1721. }
  1722. } else if (type.equals("其他入库") || type.equals("外购入库") || type.equals("生产入库") || type.equals("委外入库") || type.equals("返修入库")) {
  1723. if ((fischeck && rb.equals("1")) || (!fischeck && rb.equals("0"))) {
  1724. return true;
  1725. } else {
  1726. return false;
  1727. }
  1728. }
  1729. return false;
  1730. }
  1731. /**
  1732. * @param isinstock 是否增加库存
  1733. * @param type 库存更新类型 0为默认形式。1表示生产领料更新现场仓 2表示委外领料更新现场仓
  1734. * @throws YosException
  1735. */
  1736. // public void updateIcinvbal(boolean isinstock, int type,Long st_stockbillid) throws YosException {
  1737. // ArrayList<String> sqlList =new ArrayList();
  1738. // Rows icstockbilldetail =dbConnect.runSqlQuery("select t1.*,t2.skucontrol from st_stockbill_items t1 left join plm_item t2 on t1.itemid=t2.itemid and t1.siteid=t2.siteid where t1.st_stockbillid ='"
  1739. // + st_stockbillid + "' and t1.siteid='" + siteid + "'");// 出入库表体
  1740. // ArrayList<Long> itemids = new ArrayList<Long>();
  1741. // itemids = icstockbilldetail.toArrayList("itemid",new ArrayList<>());
  1742. // itemids.add((long) 0);
  1743. // int i = 0;
  1744. // String sql="select * from st_invbal where itemid in"+itemids;
  1745. // sql = sql.replace("[", "(").replace("]", ")");
  1746. // Rows invbals = dbConnect.runSqlQuery(sql);
  1747. // RowsMap invbalsRowsMap=invbals.toRowsMap("itemid");
  1748. // for(Row row : icstockbilldetail){
  1749. // String itemid = row.getString("itemid");
  1750. // //String batchno = row.getString("batchno");
  1751. // //String fdcspno = row.getString("fdcspno");
  1752. // String stockid = row.getString("stockid");
  1753. //
  1754. //// if (type == 1 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  1755. //// fdcspno = "**********";
  1756. //// fbatchno = "**********";
  1757. //// fstockno = getPaoSet("TDEPARTMENT").getPao(0)
  1758. //// .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  1759. //// icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  1760. //// "fitemno='" + fitemno + "' and fstockno='" + fstockno
  1761. //// + "' and fdcspno='" + fdcspno
  1762. //// + "' and fbatchno='" + fbatchno + "'");
  1763. //// } else if (type == 2 && !getSysVars().getBoolean("FISBATCHFORXC")) {
  1764. //// fdcspno = "**********";
  1765. //// fbatchno = "**********";
  1766. //// fstockno = getPaoSet("TSUPPLIER").getPao(0)
  1767. //// .getPaoSet("TSTOCKXC").getPao(0).getString("fstockno");
  1768. //// icinvbal = detailpao.getPaoSet("$icinvbal", "icinvbal",
  1769. //// "fitemno='" + fitemno + "' and fstockno='" + fstockno
  1770. //// + "' and fdcspno='" + fdcspno
  1771. //// + "' and fbatchno='" + fbatchno + "'");
  1772. //// }
  1773. // BigDecimal qty = isinstock ? row.getBigDecimal("qty") : row.getBigDecimal("qty").negate();
  1774. // if(!invbalsRowsMap.containsKey(itemid)){
  1775. // SQLFactory sqlFactory = new SQLFactory(this, "即时库存新增");
  1776. // sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  1777. // sqlFactory.addParameter("qty", qty);
  1778. // sqlFactory.addParameter("itemid", itemid);
  1779. // sqlFactory.addParameter("stockid", stockid);
  1780. // sqlFactory.addParameter("siteid",siteid);
  1781. // sqlFactory.addParameter("userid", userid);
  1782. // sqlFactory.addParameter("username", username);
  1783. // sqlList.add(sqlFactory.getSQL());
  1784. // }else{
  1785. // if(invbalsRowsMap.get(itemid).toRowsMap("stockid").containsKey(stockid)){
  1786. // SQLFactory sqlFactory = new SQLFactory(this, "即时库存更新");
  1787. // sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  1788. // sqlFactory.addParameter("qty", invbalsRowsMap.get(itemid).toRowsMap("stockid").get(stockid).get(0).getBigDecimal("qty").add(qty));
  1789. // sqlFactory.addParameter("itemid", itemid);
  1790. // sqlFactory.addParameter("stockid", stockid);
  1791. // sqlFactory.addParameter("siteid",siteid);
  1792. // sqlFactory.addParameter("userid", userid);
  1793. // sqlFactory.addParameter("username", username);
  1794. // sqlList.add(sqlFactory.getSQL());
  1795. // }else{
  1796. // SQLFactory sqlFactory = new SQLFactory(new Invbal(), "即时库存新增");
  1797. // sqlFactory.addParameter("st_invbalid", createTableID("st_invbal"));
  1798. // sqlFactory.addParameter("qty", qty);
  1799. // sqlFactory.addParameter("itemid", itemid);
  1800. // sqlFactory.addParameter("stockid", stockid);
  1801. // sqlFactory.addParameter("siteid",siteid);
  1802. // sqlFactory.addParameter("userid", userid);
  1803. // sqlFactory.addParameter("username", username);
  1804. // sqlList.add(sqlFactory.getSQL());
  1805. // }
  1806. // }
  1807. // }
  1808. // dbConnect.runSqlUpdate(sqlList);
  1809. // }
  1810. /**
  1811. * 账户余额冻结
  1812. *
  1813. * @param addorsub
  1814. */
  1815. public SQLList updateAccountbalance_freez(long st_stockbillid, boolean addorsub) throws YosException {
  1816. SQLList sqllist = new SQLList();
  1817. /******** 冻结数据 ********/
  1818. Rows rows = dbConnect.runSqlQuery("select t4.sa_accountbalanceid,t3.sa_orderid,t3.sonum,ROUND(sum(t1.qty*t2.price*ifnull(t2.pricerate,1)*ifnull(t2.rwpricerate,1)), 2) amount from st_stockbill_items t1 \n" + " inner join sa_orderitems t2 on t1.sa_orderitemsid=t2.sa_orderitemsid and t1.siteid=t2.siteid\n" + " inner join sa_order t3 on t2.sa_orderid=t3.sa_orderid and t2.siteid=t3.siteid\n" + "\t\t\t\t\t\t\t\t\tleft join sa_accountbalance t4 on t4.sa_accountclassid=t3.sa_accountclassid and t4.sys_enterpriseid=t3.sys_enterpriseid and t4.siteid=t3.siteid\n" + " where t1.st_stockbillid=" + st_stockbillid + " group by t4.sa_accountbalanceid,t3.sa_orderid,t3.sonum");
  1819. if (addorsub) {
  1820. for (Row row : rows) {
  1821. String sonum = row.getString("sonum");
  1822. long sa_orderid = row.getLong("sa_orderid");
  1823. long sa_accountbalanceid = row.getLong("sa_accountbalanceid");
  1824. BigDecimal amount = row.getBigDecimal("amount");
  1825. Rows accountbalancefreezrows = dbConnect.runSqlQuery("select sa_accountbalance_freezid from sa_accountbalance_freez where sourceid=" + sa_orderid + " and sourcetable='sa_order' and siteid='" + siteid + "'");
  1826. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)+" + amount + " where sa_accountbalanceid=" + sa_accountbalanceid + " and siteid='" + siteid + "'");
  1827. if (accountbalancefreezrows.isNotEmpty()) {
  1828. sqllist.add("update sa_accountbalance_freez set amount=amount+" + amount + " where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  1829. } else {
  1830. long sa_accountbalance_freezid = createTableID("sa_accountbalance_freez");
  1831. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_accountbalance_freez");
  1832. insertSQL.setUniqueid(sa_accountbalance_freezid);
  1833. insertSQL.setSiteid(siteid);
  1834. insertSQL.setValue("sa_accountbalanceid", sa_accountbalanceid);
  1835. insertSQL.setValue("sourcetable", "sa_order");
  1836. insertSQL.setValue("sourceid", sa_orderid);
  1837. insertSQL.setValue("amount", amount);
  1838. insertSQL.setValue("remarks", "由订单" + sonum + "审核时冻结");
  1839. insertSQL.setValue("createby", username);
  1840. insertSQL.setDateValue("createdate");
  1841. sqllist.add(insertSQL.getSQL());
  1842. }
  1843. }
  1844. } else {
  1845. for (Row row : rows) {
  1846. long sa_orderid = row.getLong("sa_orderid");
  1847. long sa_accountbalanceid = row.getLong("sa_accountbalanceid");
  1848. BigDecimal amount = row.getBigDecimal("amount");
  1849. Rows accountbalancefreezrows = dbConnect.runSqlQuery("select sa_accountbalance_freezid,amount from sa_accountbalance_freez where sourceid=" + sa_orderid + " and sourcetable='sa_order' and siteid='" + siteid + "'");
  1850. if (accountbalancefreezrows.size() > 0) {
  1851. sqllist.add("update sa_accountbalance set freezamount=ifnull(freezamount,0)-" + amount + " where sa_accountbalanceid=" + sa_accountbalanceid);
  1852. sqllist.add("update sa_accountbalance_freez set amount=amount-" + amount + " where sa_accountbalance_freezid=" + accountbalancefreezrows.get(0).getLong("sa_accountbalance_freezid"));
  1853. }
  1854. }
  1855. }
  1856. return sqllist;
  1857. }
  1858. public String[] getDistinctArray(String[] arrays) {
  1859. ArrayList<String> a = new ArrayList<String>();
  1860. for (String array : arrays) {
  1861. if (!a.contains(array)) {
  1862. a.add(array);
  1863. }
  1864. }
  1865. int size = a.size();
  1866. return (String[]) a.toArray(new String[size]);
  1867. }
  1868. public String getPeriod(boolean isjudge, Date date) throws YosException {
  1869. String preioddate = new SimpleDateFormat("yyyy-MM-dd").format(date);
  1870. Rows rows = dbConnect.runSqlQuery("select CONCAT_WS('-', year, LPAD(month, 2, '0')) period from st_period where begdate<='" + preioddate + "' and enddate>='" + preioddate + "'");
  1871. if (rows.size() != 1) {
  1872. if (isjudge) {
  1873. throw new YosException("单据日期所属会计期间未生成");
  1874. } else {
  1875. return "null";
  1876. }
  1877. } else {
  1878. return rows.get(0).getString("period");
  1879. }
  1880. }
  1881. public XSSFSheet addSheet(ExcelFactory excelFactory, String sheetname, Rows datarows, HashMap<String, String> titlemap) {
  1882. ArrayList<String> keylist = datarows.getFieldList();
  1883. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet(sheetname);
  1884. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  1885. XSSFCellStyle xssfCellStyle1 = xssfFWorkbook.createCellStyle();
  1886. XSSFFont font = xssfFWorkbook.createFont();
  1887. font.setColor((short) 0xa);
  1888. font.setFontHeightInPoints((short) 12);
  1889. font.setBold(true);
  1890. xssfCellStyle1.setFont(font);
  1891. CellStyle style = xssfFWorkbook.createCellStyle();
  1892. DataFormat format = xssfFWorkbook.createDataFormat();
  1893. style.setDataFormat(format.getFormat("@"));
  1894. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1895. for (int i = 0; i <= 13; i++) {
  1896. sheet.setDefaultColumnStyle(i, style);
  1897. }
  1898. ExportExcelSpecial.setBatchDetailSheetColumn2(sheet);// 设置工作薄列宽
  1899. XSSFCellStyle titleCellStyle1 = ExportExcelSpecial.createTitleCellStyle1(xssfFWorkbook);
  1900. XSSFCellStyle titleCellStyle2 = ExportExcelSpecial.createTitleCellStyle2(xssfFWorkbook);
  1901. XSSFCellStyle titleCellStyle3 = ExportExcelSpecial.createTitleCellStyle3(xssfFWorkbook);
  1902. ExportExcelSpecial.batchDetailErr(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, xssfFWorkbook);// 写入标题
  1903. for (int n = 0; n < datarows.size(); n++) {
  1904. Row row = datarows.get(n);
  1905. XSSFRow datarow = sheet.createRow(n + 3);
  1906. for (int i1 = 0; i1 < keylist.size(); i1++) {
  1907. Class fieldclazztype = datarows.getFieldMeta(keylist.get(i1)).getFieldtype();
  1908. if (fieldclazztype == Integer.class) {
  1909. datarow.createCell(i1).setCellValue(row.getInteger((String) keylist.get(i1)));
  1910. } else if (fieldclazztype == Long.class) {
  1911. datarow.createCell(i1).setCellValue(row.getLong((String) keylist.get(i1)));
  1912. } else if (fieldclazztype == Float.class) {
  1913. datarow.createCell(i1).setCellValue(row.getFloat((String) keylist.get(i1)));
  1914. } else if (fieldclazztype == Double.class) {
  1915. datarow.createCell(i1).setCellValue(row.getDouble((String) keylist.get(i1)));
  1916. } else {
  1917. datarow.createCell(i1).setCellValue(row.getString((String) keylist.get(i1)));
  1918. }
  1919. if (i1 == 13) {
  1920. datarow.getCell(i1).setCellStyle(xssfCellStyle1);
  1921. }
  1922. }
  1923. }
  1924. return sheet;
  1925. }
  1926. public static boolean isNumeric(String strNum) {
  1927. if (strNum == null) {
  1928. return false;
  1929. }
  1930. return strNum.matches("-?\\d+(\\.\\d+)?");
  1931. }
  1932. public static void updateStockBillWithVersion(Controller controller) throws YosException {
  1933. if (controller.content.containsKey("st_stockbill_v")) {
  1934. int st_stockbill_v = controller.content.getIntValue("st_stockbill_v");
  1935. Long st_stockbillid = controller.content.getLong("st_stockbillid");
  1936. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, "st_stockbill");
  1937. updateSQL.setDataVersion(st_stockbill_v);
  1938. updateSQL.setValue("changeby", controller.username);
  1939. updateSQL.setWhere("st_stockbillid", st_stockbillid);
  1940. updateSQL.setWhere("siteid", controller.siteid);
  1941. updateSQL.update();
  1942. }
  1943. }
  1944. public static void updateStockBillWithVersion(Controller controller, JSONObject object) throws YosException {
  1945. if (object.containsKey("st_stockbill_v")) {
  1946. int st_stockbill_v = object.getIntValue("st_stockbill_v");
  1947. Long st_stockbillid = object.getLong("st_stockbillid");
  1948. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(controller, "st_stockbill");
  1949. updateSQL.setDataVersion(st_stockbill_v);
  1950. updateSQL.setValue("changeby", controller.username);
  1951. updateSQL.setWhere("st_stockbillid", st_stockbillid);
  1952. updateSQL.setWhere("siteid", controller.siteid);
  1953. updateSQL.update();
  1954. }
  1955. }
  1956. }