Contract.java 107 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004
  1. package restcontroller.webmanage.sale.contract;
  2. import beans.accountbalance.Accountbalance;
  3. import beans.accountbalance.CashbillEntity;
  4. import beans.brand.Brand;
  5. import beans.datacontrllog.DataContrlLog;
  6. import beans.dataextend.DataExtend;
  7. import beans.datatag.DataTag;
  8. import beans.datateam.DataTeam;
  9. import beans.itemclass.ItemClass;
  10. import beans.itemprice.ItemPrice;
  11. import beans.order.Order;
  12. import beans.quotedprice.Quotedprice;
  13. import beans.parameter.Parameter;
  14. import beans.recycle.Recycle;
  15. import beans.reward.LockEntry;
  16. import beans.reward.Reward;
  17. import com.alibaba.fastjson.JSONArray;
  18. import com.alibaba.fastjson.JSONObject;
  19. import common.Controller;
  20. import common.YosException;
  21. import common.annotation.API;
  22. import common.annotation.CACHEING;
  23. import common.annotation.CACHEING_CLEAN;
  24. import common.data.*;
  25. import org.apache.commons.lang.StringUtils;
  26. import org.apache.poi.ss.formula.functions.T;
  27. import org.apache.poi.ss.usermodel.CellStyle;
  28. import org.apache.poi.ss.usermodel.CellType;
  29. import org.apache.poi.ss.usermodel.DataFormat;
  30. import org.apache.poi.xssf.usermodel.*;
  31. import restcontroller.R;
  32. import restcontroller.webmanage.executorService.Executor;
  33. import restcontroller.webmanage.sale.datadashboards.DataDashboards;
  34. import restcontroller.webmanage.sale.dataoverview.customersdata.customersdata;
  35. import restcontroller.webmanage.sale.hrreward.HrCashBill;
  36. import restcontroller.webmanage.sale.rebate.Rebate;
  37. import java.math.BigDecimal;
  38. import java.math.RoundingMode;
  39. import java.util.ArrayList;
  40. import java.util.HashMap;
  41. import java.util.Set;
  42. import java.util.concurrent.locks.ReentrantLock;
  43. import static beans.order.Order.updateRebateFee;
  44. import static restcontroller.webmanage.sale.contract.JJContract.idLocks;
  45. /**
  46. * 合同管理
  47. */
  48. public class Contract extends Controller {
  49. /**
  50. * 构造函数
  51. *
  52. * @param content
  53. */
  54. public Contract(JSONObject content) throws YosException {
  55. super(content);
  56. }
  57. public String getBillNo(Long sa_contractid) throws YosException {
  58. Rows rows = dbConnect.runSqlQuery("SELECT billno from sa_contract WHERE sa_contractid= " + sa_contractid + " and siteid = '" + siteid + "'");
  59. String billno = "";
  60. if (rows.isNotEmpty()) {
  61. billno = rows.get(0).getString("billno");
  62. }
  63. return billno;
  64. }
  65. public Row getItemRow(Long sa_contract_itemsid) throws YosException {
  66. Rows rows = dbConnect.runSqlQuery("SELECT * from plm_item WHERE isshow=1 and itemid in ( SELECT itemid from sa_contract_items WHERE sa_contract_itemsid = " + sa_contract_itemsid + ") and siteid ='" + siteid + "'");
  67. return rows.isNotEmpty() ? rows.get(0) : new Row();
  68. }
  69. @API(title = "合同中的业务员选择", apiversion = R.ID20230305201202.v1.class)
  70. public String getSale() throws YosException {
  71. Long type = content.getLongValue("type");
  72. Long sys_enterpriseid = 0L;
  73. Rows rows = new Rows();
  74. SQLFactory sqlFactory = null;
  75. switch (type.toString()) {
  76. //经销商合作协议
  77. case "1":
  78. sys_enterpriseid = content.getLong("sys_enterpriseid");
  79. sqlFactory = new SQLFactory(this, "经销商授权的业务员");
  80. sqlFactory.addParameter("siteid", siteid);
  81. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  82. break;
  83. //经销项目协议,直销项目协议,居间协议
  84. case "2":
  85. Long sa_projectid = content.getLong("sa_projectid");
  86. sqlFactory = new SQLFactory(this, "项目中的业务员");
  87. sqlFactory.addParameter("siteid", siteid);
  88. sqlFactory.addParameter("sa_projectid", sa_projectid);
  89. break;
  90. case "3":
  91. //工具借用协议,选择的企业(客户负责人、经销商授权业务员)的负责人
  92. sys_enterpriseid = content.getLong("sys_enterpriseid");
  93. sqlFactory = new SQLFactory(this, "企业中的业务员");
  94. sqlFactory.addParameter("siteid", siteid);
  95. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  96. break;
  97. case "4":
  98. //居间协议,选择客户合同
  99. sys_enterpriseid = content.getLong("sys_enterpriseid");
  100. sqlFactory = new SQLFactory(this, "客户负责人");
  101. sqlFactory.addParameter("siteid", siteid);
  102. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  103. break;
  104. }
  105. if (sqlFactory != null) {
  106. String sql = sqlFactory.getSQL();
  107. rows = dbConnect.runSqlQuery(sql);
  108. }
  109. return getSucReturnObject().setData(rows).toString();
  110. }
  111. @API(title = "作废", apiversion = R.ID20221121202502.v1.class)
  112. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20221223102102.v1.class})
  113. public String delete() throws YosException {
  114. JSONArray sa_contractids = content.getJSONArray("sa_contractids");
  115. Rows rows = dbConnect.runSqlQuery("select 1 from sa_contract where siteid='" + siteid + "' and (status = '已提交' or (status='审核' and CURRENT_DATE >= begdate and CURRENT_DATE <= enddate)) and sa_contractid in "
  116. + sa_contractids.toString().replace("[", "(").replace("]", ")"));
  117. if (rows.isNotEmpty()) {
  118. return getReturnObject().setCode("0199", new String[0]).toString();//提交状态或审核状态的合同无法作废
  119. }
  120. SQLFactory sqlFactory = new SQLFactory(this, "合同-作废");
  121. sqlFactory.addParameter("siteid", siteid);
  122. sqlFactory.addParameter_in("sa_contractid", sa_contractids.toArray());
  123. dbConnect.runSqlUpdate(sqlFactory);
  124. //新增删除或作废原因
  125. DataExtend.createDeleteReasonSql(this, "sa_contract", sa_contractids.toJavaList(Long.class), content.getStringValue("deletereason"));
  126. ArrayList<String> sqlList = new ArrayList<>();
  127. for (Object obj : sa_contractids) {
  128. Long id = Long.valueOf(obj.toString());
  129. sqlList.add(DataContrlLog.createLog(this, "sa_contract", id, "作废", "作废合同至回收站").getSQL());
  130. ArrayList<Long> userids = DataTeam.queryTeamRowWithoutHeadpic(this, "sa_contract", id).toArrayList("userid", new ArrayList<>());
  131. JSONObject extradata = new JSONObject();
  132. extradata.put("extraUserList", userids);
  133. Executor.sendEml_controller(this, "contract_zf", id, extradata);
  134. }
  135. dbConnect.runSqlUpdate(sqlList);
  136. return getSucReturnObject().toString();
  137. }
  138. @API(title = "提交", apiversion = R.ID20221121202802.v1.class)
  139. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20221223102102.v1.class}, apiClass = Contract.class)
  140. public String submit() throws YosException {
  141. JSONArray sa_contractids = content.getJSONArray("sa_contractids");
  142. for (Object object : sa_contractids) {
  143. Rows rows = dbConnect.runSqlQuery("SELECT * from sa_contract_items WHERE sa_contractid=" + object + " and itemid=0 and siteid='" + siteid + "'");
  144. for (Row row : rows) {
  145. long sa_lectotypecfgid = row.getLong("sa_lectotypecfgid");
  146. Rows lectotypecfrows = dbConnect.runSqlQuery("SELECT `status` from sa_lectotypecfg WHERE sa_lectotypecfgid='" + sa_lectotypecfgid + "' and siteid='" + siteid + "'");
  147. if (lectotypecfrows.isNotEmpty()) {
  148. String status = lectotypecfrows.get(0).getString("status");
  149. if (status.contains("评审拒绝") || status.contains("待评审")) {
  150. return getErrReturnObject().setErrMsg("报价中存在未通过的成品配置.").toString();
  151. }
  152. }
  153. }
  154. }
  155. SQLFactory sqlFactory = new SQLFactory(this, "合同-提交");
  156. sqlFactory.addParameter("siteid", siteid);
  157. sqlFactory.addParameter("userid", userid);
  158. sqlFactory.addParameter("username", username);
  159. sqlFactory.addParameter_in("sa_contractid", sa_contractids.toArray());
  160. dbConnect.runSqlUpdate(sqlFactory);
  161. ArrayList<String> sqlList = new ArrayList<>();
  162. for (Object obj : sa_contractids) {
  163. Long id = Long.valueOf(obj.toString());
  164. sqlList.add(DataContrlLog.createLog(this, "sa_contract", id, "提交", "提交合同" + getBillNo(id)).getSQL());
  165. ArrayList<Long> userids = DataTeam.queryTeamRowWithoutHeadpic(this, "sa_contract", id).toArrayList("userid", new ArrayList<>());
  166. JSONObject extradata = new JSONObject();
  167. extradata.put("extraUserList", userids);
  168. Executor.sendEml_controller(this, "contract_tj", id, extradata);
  169. }
  170. dbConnect.runSqlUpdate(sqlList);
  171. return getSucReturnObject().toString();
  172. }
  173. @API(title = "审核", apiversion = R.ID20221121203102.v1.class)
  174. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class,
  175. R.ID20221223102102.v1.class, R.ID20240829103004.v1.class, R.ID20240828165904.v1.class, R.ID20230104194002.v1.class,
  176. R.ID20230105194902.v1.class, R.ID20230105092302.v1.class, R.ID20240926150804.v1.class, R.ID20230713132804.class},
  177. apiClass = {Contract.class, Rebate.class, HrCashBill.class, DataDashboards.class, customersdata.class})
  178. public String audit() throws YosException {
  179. Long type = content.getLongValue("type");
  180. String status = type == 1 ? "审核" : "新建";
  181. Long sa_contractid = content.getLong("sa_contractid");
  182. String sql = "SELECT * from sa_contract WHERE siteid='" + siteid + "' and sa_contractid = " + sa_contractid;
  183. Rows rows = dbConnect.runSqlQuery(sql);
  184. if (rows.isEmpty()) {
  185. return getReturnObject().setCode("0200", new String[0]).toString();//合同不存在,无法审核
  186. }
  187. if (rows.get(0).getString("type").equals("居间")) {
  188. Long temp_sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  189. Long ascription_contractid = rows.get(0).getLong("ascription_contractid");
  190. String begdate = rows.get(0).getString("begdate");
  191. String enddate = rows.get(0).getString("enddate");
  192. if (dbConnect.runSqlQuery("SELECT 1 FROM sa_contract WHERE deleted=0 and status='审核' and type='居间' AND ascription_contractid=" + ascription_contractid + " and sys_enterpriseid=" + temp_sys_enterpriseid + " and (current_date<=enddate and current_date>=begdate) and (('" + begdate + "'>=begdate and '" + begdate + "'<=enddate) or ('" + enddate + "'>=begdate and '" + enddate + "'<=enddate) ) AND siteid='" + siteid + "'").isNotEmpty()) {
  193. return getReturnObject().setCode("0683", new String[0]).toString();//当前客户/项目合同已关联该居间商的居间协议
  194. }
  195. }
  196. String contractType = rows.get(0).getString("type");
  197. Long temp_sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  198. Long sa_projectid = rows.get(0).getLong("sa_projectid");
  199. String submitby = rows.get(0).getString("submitby");
  200. if (contractType.equals("框架") || contractType.equals("直销")) {
  201. SQLFactory sqlFactory = new SQLFactory(this, "查询框架合同审核");
  202. sqlFactory.addParameter("siteid", siteid);
  203. sqlFactory.addParameter("sa_contractid", sa_contractid);
  204. if (dbConnect.runSqlQuery(sqlFactory).isNotEmpty()) {
  205. return getReturnObject().setCode("0201", new String[0]).toString();//审核失败,有效期内只能存在一份审核通过的经销商合作协议或直销合作协议合同
  206. }
  207. }
  208. ArrayList<String> sqlList = new ArrayList<>();
  209. SQLFactory sqlFactory = new SQLFactory(this, "合同-审核");
  210. sqlFactory.addParameter("siteid", siteid);
  211. sqlFactory.addParameter("userid", userid);
  212. sqlFactory.addParameter("username", username);
  213. sqlFactory.addParameter("status", status);
  214. sqlFactory.addParameter("sa_contractid", sa_contractid);
  215. sqlList.add(sqlFactory.getSQL());
  216. //操作记录
  217. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, status, "合同" + status + rows.get(0).getString("billno")).getSQL());
  218. if (siteid.equals("HY") && contractType.equals("居间")) {
  219. LockEntry lockentry = idLocks.computeIfAbsent(sa_contractid, k -> new LockEntry());
  220. lockentry.addUsersingcount();
  221. ReentrantLock lock = lockentry.getLock();
  222. lock.lock();
  223. try {
  224. JJContract.checkcontract(this, sa_contractid, sqlList);
  225. } catch (Exception e) {
  226. throw new YosException(e);
  227. } finally {
  228. lock.unlock();
  229. lockentry.subUsersingcount();
  230. JJContract.clearMap();
  231. }
  232. } else {
  233. dbConnect.runSqlUpdate(sqlList);
  234. }
  235. if (status.equals("审核")) {
  236. ArrayList<Long> userids = DataTeam.queryTeamRowWithoutHeadpic(this, "sa_contract", sa_contractid).toArrayList("userid", new ArrayList<>());
  237. ArrayList<Long> submitbyRows = dbConnect.runSqlQuery("select t1.userid from sys_users t1 left join sys_usersite t2 on t1.userid = t2.userid where siteid='"
  238. + siteid + "' and name='" + submitby + "'").toArrayList("userid", new ArrayList<>());
  239. userids.addAll(submitbyRows);
  240. JSONObject extradata = new JSONObject();
  241. extradata.put("extraUserList", userids);
  242. Executor.sendEml_controller(this, "contract_sh", sa_contractid, extradata);
  243. }
  244. updateCustomerStatus(sa_contractid, temp_sys_enterpriseid);
  245. // //将符合的项目变更为已成交
  246. // Rows projectRows = dbConnect.runSqlQuery("SELECT distinct t1.sa_projectid FROM sa_contract t1 WHERE t1.sa_contractid =" + sa_contractid +
  247. // " and not exists(select 1 from sa_project where t1.siteid=siteid and t1.sa_projectid=sa_projectid and status='已成交')");
  248. // for (Row row : projectRows) {
  249. // ArrayList<Long> useridList = new ArrayList<>();
  250. // long sa_projectid1 = row.getLong("sa_projectid");
  251. // useridList.addAll(DataTeam.queryTeamRowWithoutHeadpic(this, "sa_project", sa_projectid1).toArrayList("userid", new ArrayList<>()));
  252. // useridList.addAll(DataTeam.getProxyUserids(this, "sa_project", sa_projectid1));
  253. // HashMap<String, Object> extradata = new HashMap<>();
  254. // extradata.put("extraUserList", useridList);
  255. // Executor.sendEml(this, "project_cj", sa_projectid1, siteid, extradata);
  256. // }
  257. // dbConnect.runSqlUpdate("UPDATE sa_project SET `status`='已成交' WHERE sa_projectid = " + rows.get(0).getLong("sa_projectid"));
  258. // ArrayList<String> stageList = dbConnect.runSqlQuery("select stagename from sa_project_stage where siteid='" + siteid + "' and sa_projectid = " + rows.get(0).getLong("sa_projectid")).toArrayList("stagename");
  259. // if (stageList.contains("供货及服务")) {
  260. // dbConnect.runSqlUpdate("UPDATE sa_project_stage SET `active`=0 WHERE sa_projectid = " + rows.get(0).getLong("sa_projectid"));
  261. // dbConnect.runSqlUpdate("UPDATE sa_project_stage SET `active`=1 WHERE sa_projectid = " + rows.get(0).getLong("sa_projectid") + " and stagename='供货及服务'");
  262. // }
  263. if (contractType.equals("居间")) {
  264. if (sa_projectid > 0) {
  265. rows = dbConnect.runSqlQuery("SELECT sa_project_partiesid from sa_project_parties WHERE sa_projectid = " + sa_projectid + " and sys_enterpriseid = " + temp_sys_enterpriseid + " and siteid = '" + siteid + "'");
  266. if (rows.isNotEmpty()) {
  267. Long id = rows.get(0).getLong("sa_project_partiesid");
  268. dbConnect.runSqlUpdate("UPDATE sa_project_parties SET type='居间服务商' WHERE sa_project_partiesid = " + id);
  269. } else {
  270. sqlFactory = new SQLFactory(this, "新增缔约方");
  271. sqlFactory.addParameter("siteid", siteid);
  272. sqlFactory.addParameter("username", username);
  273. sqlFactory.addParameter("userid", userid);
  274. sqlFactory.addParameter("sa_project_partiesid", createTableID("sa_project_parties"));
  275. sqlFactory.addParameter("sa_projectid", sa_projectid);
  276. sqlFactory.addParameter("sys_enterpriseid", temp_sys_enterpriseid);
  277. dbConnect.runSqlUpdate(sqlFactory);
  278. }
  279. DataTag.createTag(this, "sa_project", sa_projectid, "居间");
  280. }
  281. Long ascription_contractid = rows.get(0).getLong("ascription_contractid");
  282. //刷新订单的居间费
  283. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_order", "sa_orderid", "sonum")
  284. .setTableAlias("t1");
  285. querySQL.addJoinTable(JOINTYPE.inner, "sa_contract", "t2", "t2.ascription_contractid=t1.sa_contractid and t2.siteid=t1.siteid");
  286. querySQL.setSiteid(siteid);
  287. querySQL.setWhere("t1.STATUS in ('审核','关闭') and t1.checkdate>=t2.begdate and t1.checkdate<=t2.enddate");
  288. querySQL.setWhere("t2.sa_contractid", sa_contractid);
  289. Rows orderrows = querySQL.query();
  290. RowsMap rowsMap = orderrows.toRowsMap("sa_orderid");
  291. ArrayList<String> sa_orderids = orderrows.toArrayList("sa_orderid");
  292. for (String sa_orderid : sa_orderids) {
  293. String sonum = rowsMap.getOrDefault(sa_orderid, new Rows()).get(0).getString("sonum");
  294. updateRebateFee(this, Long.valueOf(sa_orderid), "订单审核", "由订单【" + sonum + "】审核生成", sa_contractid);
  295. }
  296. }
  297. //刷新未关闭订单的收款条件
  298. if (type == 1 && !contractType.equals("居间")) {
  299. sqlList.clear();
  300. Rows orderRows = dbConnect.runSqlQuery("SELECT sa_orderid from sa_order WHERE status!='关闭' and deleted=0 and sa_contractid=" + sa_contractid + " and siteid='" + siteid + "'");
  301. String paytype = rows.get(0).getString("paytype");
  302. Rows receivableruleRows = dbConnect.runSqlQuery("select sa_receivableruleid,accountingnodes from sa_receivablerule where siteid='" + siteid + "' and '" + paytype + "' like concat(ruleno,'-','%')");
  303. if (receivableruleRows.isNotEmpty() && orderRows.isNotEmpty()) {
  304. for (Row orderRow : orderRows) {
  305. DeleteSQL deleteSQL=SQLFactory.createDeleteSQL(this,"sa_order_receivablerule");
  306. deleteSQL.setSiteid(siteid);
  307. deleteSQL.setWhere("sa_orderid",orderRow.getLong("sa_orderid"));
  308. sqlList.add(deleteSQL.getSQL());
  309. JSONObject accountingnodes = receivableruleRows.get(0).getJSONObject("accountingnodes");
  310. Long sa_receivableruleid = receivableruleRows.get(0).getLong("sa_receivableruleid");
  311. for (String key : accountingnodes.keySet()) {
  312. JSONArray jsonArray = accountingnodes.getJSONArray(key);
  313. long[] sa_order_receivableruleids = createTableID("sa_order_receivablerule", jsonArray.size());
  314. int i = 0;
  315. for (Object o : jsonArray) {
  316. JSONObject jsonObject = (JSONObject) o;
  317. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_order_receivablerule");
  318. insertSQL.setSiteid(siteid);
  319. insertSQL.setValue("isused", jsonObject.getString("isused"));
  320. insertSQL.setValue("days", jsonObject.getString("days"));
  321. insertSQL.setValue("amountrate", jsonObject.getString("amountrate"));
  322. insertSQL.setValue("iswarranty", jsonObject.getString("iswarranty"));
  323. insertSQL.setValue("point", jsonObject.getString("point"));
  324. insertSQL.setValue("sa_orderid", orderRow.getLong("sa_orderid"));
  325. insertSQL.setValue("sa_receivableruleid", sa_receivableruleid);
  326. insertSQL.setValue("sa_order_receivableruleid", sa_order_receivableruleids[i]);
  327. sqlList.add(insertSQL.getSQL());
  328. i++;
  329. }
  330. }
  331. }
  332. }
  333. if(sqlList.size()>0){
  334. dbConnect.runSqlUpdate(sqlList);
  335. }
  336. }
  337. return getSucReturnObject().toString();
  338. }
  339. public void updateCustomerStatus(Long sa_contractid, Long sys_enterpriseid) throws YosException {
  340. //将符合的客户变更为已成交
  341. String sql = "SELECT COUNT(0) count from sa_contract WHERE sys_enterpriseid = " + sys_enterpriseid + " and `status`='审核' and deleted=0";
  342. Row row = dbConnect.runSqlQuery(sql).get(0);
  343. Rows customersRows = dbConnect.runSqlQuery("select sa_customersid from sa_customers where siteid='" + siteid + "' and sys_enterpriseid=" + sys_enterpriseid);
  344. Long count = row.getLong("count");
  345. if (count >= 1) {
  346. dbConnect.runSqlUpdate("UPDATE sa_customers SET status='合作中' WHERE sys_enterpriseid = (SELECT sys_enterpriseid FROM sa_contract WHERE sa_contractid =" + sa_contractid + " )");
  347. if (customersRows.isNotEmpty()) {
  348. Long sa_customersid = customersRows.get(0).getLong("sa_customersid");
  349. DataTag.deleteTag(this, "sa_customers", sa_customersid, "潜在");
  350. DataTag.deleteTag(this, "sa_customers", sa_customersid, "已终止");
  351. DataTag.deleteTag(this, "sa_customers", sa_customersid, "暂缓");
  352. DataTag.createTag(this, "sa_customers", sa_customersid, "合作中");
  353. }
  354. } else {
  355. dbConnect.runSqlUpdate("UPDATE sa_customers SET status='潜在' WHERE sys_enterpriseid = (SELECT sys_enterpriseid FROM sa_contract WHERE sa_contractid =" + sa_contractid + " )");
  356. if (customersRows.isNotEmpty()) {
  357. Long sa_customersid = customersRows.get(0).getLong("sa_customersid");
  358. DataTag.deleteTag(this, "sa_customers", sa_customersid, "合作中");
  359. DataTag.deleteTag(this, "sa_customers", sa_customersid, "已终止");
  360. DataTag.deleteTag(this, "sa_customers", sa_customersid, "暂缓");
  361. DataTag.createTag(this, "sa_customers", sa_customersid, "潜在");
  362. }
  363. }
  364. }
  365. @API(title = "反审核", apiversion = R.ID20221212135402.v1.class)
  366. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class,
  367. R.ID20221223102102.v1.class, R.ID20240829103004.v1.class, R.ID20240828165904.v1.class, R.ID20230104194002.v1.class,
  368. R.ID20230105194902.v1.class, R.ID20230105092302.v1.class, R.ID20240926150804.v1.class, R.ID20230713132804.class},
  369. apiClass = {Contract.class, Rebate.class, HrCashBill.class, DataDashboards.class, customersdata.class})
  370. public String cancelAudit() throws YosException {
  371. Long sa_contractid = content.getLong("sa_contractid");
  372. Rows rows = dbConnect.runSqlQuery("select * from sa_contract where siteid='" + siteid + "' and sa_contractid=" + sa_contractid);
  373. ArrayList<String> sqlList = new ArrayList<>();
  374. SQLFactory sqlFactory = new SQLFactory(this, "合同-反审核");
  375. sqlFactory.addParameter("siteid", siteid);
  376. sqlFactory.addParameter("userid", userid);
  377. sqlFactory.addParameter("username", username);
  378. sqlFactory.addParameter_in("sa_contractid", sa_contractid);
  379. sqlList.add(sqlFactory.getSQL());
  380. //操作记录
  381. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "反审核", "反审核合同" + getBillNo(sa_contractid)).getSQL());
  382. Long sys_enterpriseid = 0L;
  383. String contractType = "";
  384. ArrayList<Long> userids = DataTeam.queryTeamRowWithoutHeadpic(this, "sa_contract", sa_contractid).toArrayList("userid", new ArrayList<>());
  385. if (rows.isNotEmpty()) {
  386. ArrayList<Long> submitbyRows = dbConnect.runSqlQuery("select t1.userid from sys_users t1 left join sys_usersite t2 on t1.userid = t2.userid where siteid='"
  387. + siteid + "' and name='" + rows.get(0).getString("submitby") + "'").toArrayList("userid", new ArrayList<>());
  388. userids.addAll(submitbyRows);
  389. sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  390. contractType = rows.get(0).getString("type");
  391. }
  392. if (siteid.equals("HY") && contractType.equals("居间")) {
  393. LockEntry lockentry = idLocks.computeIfAbsent(sa_contractid, k -> new LockEntry());
  394. lockentry.addUsersingcount();
  395. ReentrantLock lock = lockentry.getLock();
  396. lock.lock();
  397. try {
  398. JJContract.checkcontract(this, sa_contractid, sqlList);
  399. } catch (Exception e) {
  400. throw new YosException(e);
  401. } finally {
  402. lock.unlock();
  403. lockentry.subUsersingcount();
  404. JJContract.clearMap();
  405. }
  406. } else {
  407. dbConnect.runSqlUpdate(sqlList);
  408. }
  409. JSONObject extradata = new JSONObject();
  410. extradata.put("extraUserList", userids);
  411. Executor.sendEml_controller(this, "contract_fsh", sa_contractid, extradata);
  412. updateCustomerStatus(sa_contractid, sys_enterpriseid);
  413. return getSucReturnObject().toString();
  414. }
  415. @API(title = "撤回", apiversion = R.ID20230130091502.v1.class)
  416. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20221223102102.v1.class}, apiClass = Contract.class)
  417. public String revoke() throws YosException {
  418. Long sa_contractid = content.getLong("sa_contractid");
  419. ArrayList<String> sqlList = new ArrayList<>();
  420. SQLFactory sqlFactory = new SQLFactory(this, "合同-撤回");
  421. sqlFactory.addParameter("siteid", siteid);
  422. sqlFactory.addParameter("userid", userid);
  423. sqlFactory.addParameter("username", username);
  424. sqlFactory.addParameter_in("sa_contractid", sa_contractid);
  425. sqlList.add(sqlFactory.getSQL());
  426. //操作记录
  427. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "撤回", "撤回合同" + getBillNo(sa_contractid)).getSQL());
  428. dbConnect.runSqlUpdate(sqlList);
  429. ArrayList<Long> userids = DataTeam.queryTeamRowWithoutHeadpic(this, "sa_contract", sa_contractid).toArrayList("userid", new ArrayList<>());
  430. JSONObject extradata = new JSONObject();
  431. extradata.put("extraUserList", userids);
  432. Executor.sendEml_controller(this, "contract_ch", sa_contractid, extradata);
  433. return getSucReturnObject().toString();
  434. }
  435. @API(title = "查询产品列表", apiversion = R.ID20221122165302.v1.class)
  436. @CACHEING
  437. public String selectItems() throws YosException {
  438. Long sa_contractid = content.getLong("sa_contractid");
  439. Boolean isExport = content.getBooleanValue("isExport");
  440. StringBuffer where = new StringBuffer(" 1=1 ");
  441. if (content.containsKey("where")) {
  442. JSONObject whereObject = content.getJSONObject("where");
  443. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  444. where.append(" and(");
  445. where.append("t2.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  446. where.append("or t2.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  447. where.append("or t3.material like'%").append(whereObject.getString("condition")).append("%' ");
  448. where.append("or t2.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  449. where.append("or t3.erpitemname like'%").append(whereObject.getString("condition")).append("%' ");
  450. where.append("or t3.erpitemno like'%").append(whereObject.getString("condition")).append("%' ");
  451. where.append(")");
  452. }
  453. }
  454. SQLFactory sqlFactory = new SQLFactory(this, "合同-产品列表", pageSize, pageNumber, pageSorting);
  455. if (isExport) {
  456. sqlFactory = new SQLFactory(this, "合同-产品列表");
  457. }
  458. sqlFactory.addParameter("siteid", siteid);
  459. sqlFactory.addParameter("sa_contractid", sa_contractid);
  460. sqlFactory.addParameter_SQL("where", where);
  461. String sql = sqlFactory.getSQL();
  462. Rows rows = dbConnect.runSqlQuery(sql);
  463. ArrayList<Long> itemids = rows.toArrayList("itemid", new ArrayList<>());
  464. RowsMap itemclassRowsMap = ItemClass.getItemClassNameRowsMap(this, itemids);
  465. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, itemids);
  466. //附件
  467. RowsMap attRowsMap = getAttachmentUrl("plm_item", itemids);
  468. for (Row row : rows) {
  469. row.put("brand", brandRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  470. row.put("attinfos", attRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  471. row.put("itemclass", itemclassRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  472. Long itemid = row.getLong("itemid");
  473. Long sa_lectotypecfgid = row.getLong("sa_lectotypecfgid");
  474. if (itemid == 0) {
  475. Rows extendrows = dbConnect.runSqlQuery("SELECT caliber,nominalpressure FROM plm_itemextend t1 INNER JOIN sa_lectotypecfg_item t2 ON t2.part_itemid=t1.itemid WHERE sa_lectotypecfgid=" + sa_lectotypecfgid + " AND parttype='主阀' and t1.siteid='" + siteid + "'");
  476. if (extendrows.isNotEmpty()) {
  477. row.put("caliber", extendrows.get(0).getString("caliber"));
  478. row.put("nominalpressure", extendrows.get(0).getJSONArray("nominalpressure"));
  479. }
  480. }
  481. }
  482. if (isExport) {
  483. Rows contractRows = dbConnect.runSqlQuery("select type from sa_contract where siteid='" + siteid + "' and sa_contractid=" + sa_contractid);
  484. if (contractRows.isEmpty()) {
  485. return getReturnObject().setCode("0202", new String[0]).toString();//合同不存在
  486. }
  487. String type = contractRows.get(0).getString("type");
  488. ExcelFactory excelFactory = new ExcelFactory("报价单明细导出");
  489. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet("报价单明细导出");
  490. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  491. ExportExcel.setBatchDetailSheetColumn3(sheet);// 设置工作薄列宽
  492. XSSFCellStyle titleCellStyle1 = ExportExcel.createTitleCellStyle3(xssfFWorkbook);
  493. XSSFCellStyle titleCellStyle2 = ExportExcel.createBodyCellStyle1(xssfFWorkbook);
  494. ExportExcel.download(sheet, titleCellStyle1, titleCellStyle2, rows, type);// 写入标题
  495. Rows aa = uploadExcelToObs(excelFactory);
  496. String url = "";
  497. if (!aa.isEmpty()) {
  498. url = aa.get(0).getString("url");
  499. }
  500. return getSucReturnObject().setData(url).toString();
  501. }
  502. return getSucReturnObject().setData(rows).toString();
  503. }
  504. @API(title = "编辑产品", apiversion = R.ID20221122200302.v1.class)
  505. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class}, apiClass = Contract.class)
  506. public String editItems() throws YosException {
  507. Long sa_contractid = content.getLong("sa_contractid");
  508. JSONArray items = content.getJSONArray("items");
  509. ArrayList<String> sqlList = new ArrayList<>();
  510. ArrayList<Long> itemids = new ArrayList<>();
  511. for (Object obj : items) {
  512. JSONObject item = (JSONObject) obj;
  513. Long id = item.getLongValue("sa_contract_itemsid");
  514. BigDecimal price = item.getBigDecimal("price");
  515. Rows rows = dbConnect.runSqlQuery("SELECT * from sa_contract_items WHERE sa_contract_itemsid=" + id + " and siteid='" + siteid + "'");
  516. if (rows.isNotEmpty()) {
  517. if (rows.get(0).getLong("itemid") == 0) {
  518. BigDecimal tempprice = rows.get(0).getBigDecimal("price");
  519. if (tempprice.compareTo(price) > 0) {
  520. //当前配置不存在成品,价格只能往上调整。
  521. return getReturnObject().setCode("0692", new String[0]).toString();
  522. }
  523. }
  524. }
  525. SQLFactory sqlFactory = new SQLFactory(this, "合同-更新产品");
  526. sqlFactory.addParameter("siteid", siteid);
  527. sqlFactory.addParameter("sa_contract_itemsid", id);
  528. if (item.getBigDecimalValue("qty").compareTo(BigDecimal.ZERO) == 0) {
  529. return getReturnObject().setCode("0203", new String[0]).toString();//添加失败
  530. }
  531. sqlFactory.addParameter("qty", item.getBigDecimal("qty"));
  532. sqlFactory.addParameter("price", item.getBigDecimal("price"));
  533. sqlFactory.addParameter("discountrate", item.getBigDecimal("discountrate"));
  534. sqlFactory.addParameter("remarks", item.getStringValue("remarks"));
  535. sqlFactory.addParameter("type", item.getStringValue("type"));
  536. sqlFactory.addParameter("marketprice", item.getBigDecimal("marketprice"));
  537. sqlFactory.addParameter("model", item.getStringValue("model"));
  538. String sql = sqlFactory.getSQL();
  539. sqlList.add(sql);
  540. Row row = getItemRow(id);
  541. itemids.add(row.getLong("itemid"));
  542. String itemno = row.isEmpty() ? "" : row.getString("itemno");
  543. boolean istool = row.isEmpty() ? false : row.getBoolean("istool");
  544. if (istool) {
  545. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "编辑工具", "编辑工具" + itemno).getSQL());
  546. } else {
  547. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "编辑产品", "编辑产品" + itemno).getSQL());
  548. }
  549. }
  550. dbConnect.runSqlUpdate(sqlList);
  551. SQLFactory sqlFactory = new SQLFactory(this, "合同-产品列表2");
  552. sqlFactory.addParameter("siteid", siteid);
  553. sqlFactory.addParameter("sa_contractid", sa_contractid);
  554. sqlFactory.addParameter_in("itemid", itemids);
  555. String sql = sqlFactory.getSQL();
  556. Rows rows = dbConnect.runSqlQuery(sql);
  557. // Rows rows = dbConnect.runSqlQuery("select ifnull(sum(price*qty),0) signamount from sa_contract_items WHERE sa_contractid = " + sa_contractid);
  558. // String signamount = rows.get(0).getBigDecimal("signamount").toPlainString();
  559. // JSONObject jsonObject = new JSONObject();
  560. // jsonObject.put("signamount", signamount);
  561. return getSucReturnObject().setData(rows).toString();
  562. }
  563. @API(title = "获取项目报价单", apiversion = R.ID20221222151302.v1.class)
  564. public String getProjectQuotedPrice() throws YosException {
  565. Long sa_projectid = content.getLong("sa_projectid");
  566. StringBuffer where = new StringBuffer(" 1=1 ");
  567. if (content.containsKey("where")) {
  568. JSONObject whereObject = content.getJSONObject("where");
  569. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  570. where.append(" and(");
  571. where.append("t1.billno like'%").append(whereObject.getString("condition")).append("%' ");
  572. where.append("or t1.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  573. where.append(")");
  574. }
  575. }
  576. String quotedpricerecheck = Parameter.get(siteid, "quotedpricerecheck");
  577. SQLFactory sqlFactory = new SQLFactory(this, "查询项目报价单列表", pageSize, pageNumber, pageSorting);
  578. // if (quotedpricerecheck.equals("1")) {
  579. // sqlFactory = new SQLFactory(this, "查询项目报价单列表_特价审批", pageSize, pageNumber, pageSorting);
  580. // }
  581. sqlFactory.addParameter("siteid", siteid);
  582. sqlFactory.addParameter("sa_projectid", sa_projectid);
  583. sqlFactory.addParameter_SQL("where", where);
  584. String sql = sqlFactory.getSQL();
  585. Rows rows = dbConnect.runSqlQuery(sql);
  586. RowsMap quotedpriceRowsMap = Quotedprice.getSpecialoffer(this, rows.toArrayList("sa_quotedpriceid", new ArrayList<>()));
  587. RowsMap leaderRowsMap = DataTeam.getLeaderWithoutHeadpic(this, "sa_quotedprice", rows.toArrayList("sa_quotedpriceid")).toRowsMap("ownerid");
  588. for (Row row : rows) {
  589. String sa_quotedpriceid = row.getString("sa_quotedpriceid");
  590. Rows specialofferRows = quotedpriceRowsMap.get(sa_quotedpriceid);
  591. if (quotedpriceRowsMap.containsKey(sa_quotedpriceid)) {
  592. row.put("specialoffer", specialofferRows.get(0).getBigDecimal("specialoffer").compareTo(BigDecimal.ZERO) > 0 ? 1 : 0);
  593. } else {
  594. row.put("specialoffer", 0);
  595. }
  596. row.put("leader", leaderRowsMap.get(sa_quotedpriceid));
  597. }
  598. return getSucReturnObject().setData(rows).toString();
  599. }
  600. @API(title = "查询可添加的商品(报价单里的产品列表)", apiversion = R.ID20221123162902.v1.class)
  601. public String canAddItems() throws YosException {
  602. Long sa_contractid = content.getLong("sa_contractid");
  603. Long sa_quotedpriceid = content.getLong("sa_quotedpriceid");
  604. StringBuffer where = new StringBuffer(" 1=1 ");
  605. if (content.containsKey("where")) {
  606. JSONObject whereObject = content.getJSONObject("where");
  607. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  608. where.append(" and(");
  609. where.append("t2.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  610. where.append("or t3.erpitemno like'%").append(whereObject.getString("condition")).append("%' ");
  611. where.append("or t3.erpitemname like'%").append(whereObject.getString("condition")).append("%' ");
  612. where.append("or t2.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  613. where.append(")");
  614. }
  615. if (whereObject.containsKey("standards") && !"".equals(whereObject.getString("standards"))) {
  616. where.append(" and(");
  617. where.append("t2.standards like'%").append(whereObject.getString("standards")).append("%' ");
  618. where.append(")");
  619. }
  620. if (whereObject.containsKey("itemclassid") && !"".equals(whereObject.getString("itemclassid"))) {
  621. where.append(" and t2.itemid in( SELECT itemid from sa_itemsaleclass WHERE itemclassid =" + whereObject.getLong("itemclassid") + " and siteid='" + siteid + "')");
  622. }
  623. if (whereObject.containsKey("sa_brandid") && !"".equals(whereObject.getString("sa_brandid"))) {
  624. where.append(" and t2.itemid in( SELECT DISTINCT itemid from sa_itemsaleclass WHERE itemclassid in (SELECT itemclassid from plm_itemclass WHERE sa_brandid = " + whereObject.getLong("sa_brandid") + " and siteid = '" + siteid + "'))");
  625. }
  626. if (whereObject.containsKey("model") && !"".equals(whereObject.getString("model"))) {
  627. where.append(" and(").append("t2.model like'%").append(whereObject.getString("model")).append("%')");
  628. }
  629. if (whereObject.containsKey("spec") && !"".equals(whereObject.getString("spec"))) {
  630. where.append(" and(").append("t2.spec like'%").append(whereObject.getString("spec")).append("%') ");
  631. }
  632. if (whereObject.containsKey("material") && !"".equals(whereObject.getString("material"))) {
  633. where.append(" and(").append("t3.material like'%").append(whereObject.getString("material")).append("%') ");
  634. }
  635. if (whereObject.containsKey("tradefield") && !"".equals(whereObject.getString("tradefield"))) {
  636. where.append(" and t2.itemid in( SELECT itemid from plm_item_tradefield WHERE tradefield ='" + whereObject.getString("tradefield") + "' and siteid='" + siteid + "')");
  637. }
  638. }
  639. if (Parameter.get(siteid, "isitemclass").equals("1") && userInfo.isSaler()) {
  640. ArrayList<Long> saleItemclassids = ItemClass.getSaleItemclass(this);
  641. if (saleItemclassids.size() > 0) {
  642. where.append(" and t1.itemid in( SELECT itemid from sa_itemsaleclass WHERE itemclassid in (" + StringUtils.join(saleItemclassids, ",") + ") and siteid='" + siteid + "')");
  643. }
  644. }
  645. SQLFactory sqlFactory = new SQLFactory(this, "合同-查询可添加的商品(项目)", pageSize, pageNumber, pageSorting);
  646. sqlFactory.addParameter("siteid", siteid);
  647. sqlFactory.addParameter("sa_contractid", sa_contractid);
  648. sqlFactory.addParameter("sa_quotedpriceid", sa_quotedpriceid);
  649. sqlFactory.addParameter_SQL("where", where);
  650. String sql = sqlFactory.getSQL();
  651. Rows rows = dbConnect.runSqlQuery(sql);
  652. ArrayList<Long> itemids = rows.toArrayList("itemid", new ArrayList<>());
  653. RowsMap itemclassRowsMap = ItemClass.getItemClassNameRowsMap(this, itemids);
  654. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, itemids);
  655. //附件
  656. RowsMap attRowsMap = getAttachmentUrl("plm_item", itemids);
  657. for (Row row : rows) {
  658. row.put("brand", brandRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  659. row.put("attinfos", attRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  660. row.put("itemclass", itemclassRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  661. row.put("discountDifferenceAmount", row.getBigDecimal("marketprice").subtract(row.getBigDecimal("price")));
  662. }
  663. return getSucReturnObject().setData(rows).toString();
  664. }
  665. @API(title = "查询可添加的商品(所有)", apiversion = R.ID20221124093602.v1.class)
  666. public String canAddAllItems() throws YosException {
  667. Long sa_contractid = content.getLong("sa_contractid");
  668. StringBuffer where = new StringBuffer(" 1=1 ");
  669. if (content.containsKey("where")) {
  670. JSONObject whereObject = content.getJSONObject("where");
  671. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  672. where.append(" and(");
  673. where.append("t1.itemname like'%").append(whereObject.getString("condition")).append("%' ");
  674. where.append("or t1.remarks like'%").append(whereObject.getString("condition")).append("%' ");
  675. where.append("or t1.itemno like'%").append(whereObject.getString("condition")).append("%' ");
  676. where.append("or t3.erpitemno like'%").append(whereObject.getString("condition")).append("%' ");
  677. where.append("or t3.erpitemname like'%").append(whereObject.getString("condition")).append("%' ");
  678. where.append(")");
  679. }
  680. if (whereObject.containsKey("istool") && !"".equals(whereObject.getString("istool"))) {
  681. where.append(" and(");
  682. where.append("t1.istool =").append(whereObject.getBooleanValue("istool")).append(" ");
  683. where.append(")");
  684. }
  685. if (whereObject.containsKey("standards") && !"".equals(whereObject.getString("standards"))) {
  686. where.append(" and(");
  687. where.append("t1.standards like'%").append(whereObject.getString("standards")).append("%' ");
  688. where.append(")");
  689. }
  690. if (whereObject.containsKey("itemclassid") && !"".equals(whereObject.getString("itemclassid"))) {
  691. where.append(" and t1.itemid in( SELECT itemid from sa_itemsaleclass WHERE itemclassid =" + whereObject.getLong("itemclassid") + " and siteid='" + siteid + "')");
  692. }
  693. if (whereObject.containsKey("sa_brandid") && !"".equals(whereObject.getString("sa_brandid"))) {
  694. where.append(" and t1.itemid in( SELECT DISTINCT itemid from sa_itemsaleclass WHERE itemclassid in (SELECT itemclassid from plm_itemclass WHERE sa_brandid = " + whereObject.getLong("sa_brandid") + " and siteid = '" + siteid + "'))");
  695. }
  696. if (whereObject.containsKey("model") && !"".equals(whereObject.getString("model"))) {
  697. where.append(" and(").append("t1.model like'%").append(whereObject.getString("model")).append("%')");
  698. }
  699. if (whereObject.containsKey("spec") && !"".equals(whereObject.getString("spec"))) {
  700. where.append(" and(").append("t1.spec like'%").append(whereObject.getString("spec")).append("%') ");
  701. }
  702. if (whereObject.containsKey("material") && !"".equals(whereObject.getString("material"))) {
  703. where.append(" and(").append("t3.material like'%").append(whereObject.getString("material")).append("%') ");
  704. }
  705. }
  706. if (Parameter.get(siteid, "isitemclass").equals("1") && userInfo.isSaler()) {
  707. ArrayList<Long> saleItemclassids = ItemClass.getSaleItemclass(this);
  708. if (saleItemclassids.size() > 0) {
  709. where.append(" and t1.itemid in( SELECT itemid from sa_itemsaleclass WHERE itemclassid in (" + StringUtils.join(saleItemclassids, ",") + ") and siteid='" + siteid + "')");
  710. }
  711. }
  712. SQLFactory sqlFactory = new SQLFactory(this, "合同-查询可添加的商品", pageSize, pageNumber, pageSorting);
  713. sqlFactory.addParameter("siteid", siteid);
  714. sqlFactory.addParameter("sa_contractid", sa_contractid);
  715. sqlFactory.addParameter_SQL("where", where);
  716. String sql = sqlFactory.getSQL();
  717. Rows rows = dbConnect.runSqlQuery(sql);
  718. ArrayList<Long> itemids = rows.toArrayList("itemid", new ArrayList<>());
  719. RowsMap itemclassRowsMap = ItemClass.getItemClassNameRowsMap(this, itemids);
  720. RowsMap brandRowsMap = Brand.getBrandRowsMap(this, itemids);
  721. //附件
  722. RowsMap attRowsMap = getAttachmentUrl("plm_item", itemids);
  723. for (Row row : rows) {
  724. row.put("brand", brandRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  725. row.put("attinfos", attRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  726. row.put("itemclass", itemclassRowsMap.getOrDefault(row.getString("itemid"), new Rows()));
  727. try {
  728. ItemPrice itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, row.getLong("itemid"));
  729. row.put("oldprice", itemPrice.getPrice());
  730. row.put("gradeprice", itemPrice.getGraderateprice().toPlainString());
  731. } catch (Exception e) {
  732. e.printStackTrace();
  733. row.put("oldprice", 0);
  734. row.put("gradeprice", 0);
  735. }
  736. }
  737. return getSucReturnObject().setData(rows).toString();
  738. }
  739. @API(title = "判断商品(报价单里的产品列表)是否重复", apiversion = R.ID20230221151903.v1.class)
  740. public String hasRepeatItems() throws YosException {
  741. Long sa_contractid = content.getLong("sa_contractid");
  742. JSONArray itemids = content.getJSONArray("itemids");
  743. String sql = "select * from sa_contract_items WHERE itemid in " + itemids + " and siteid ='" + siteid + "' and sa_contractid=" + sa_contractid;
  744. sql = sql.replace("[", "(").replace("]", ")");
  745. Rows rows = dbConnect.runSqlQuery(sql);
  746. if (rows.isEmpty()) {
  747. return getSucReturnObject().setData(false).toString();
  748. }
  749. return getSucReturnObject().setData(true).toString();
  750. }
  751. @API(title = "添加商品", apiversion = R.ID20221123164402.v1.class)
  752. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20230221151903.v1.class})
  753. public String addItem() throws YosException {
  754. Long sa_contractid = content.getLong("sa_contractid");
  755. JSONArray items = content.getJSONArray("items");
  756. ArrayList<String> sqlList = new ArrayList<>();
  757. ArrayList<Long> itemids = new ArrayList<>();
  758. for (Object obj : items) {
  759. JSONObject item = (JSONObject) obj;
  760. itemids.add(item.getLong("itemid"));
  761. sqlList.add(addItemSql(sa_contractid, item.getLong("itemid"), item.getBigDecimal("price"), item.getBigDecimalValue("discountrate", 1), item.getBigDecimal("qty"), item.getBigDecimal("marketprice"), item.getString("type")));
  762. }
  763. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "plm_item", "itemno", "istool");
  764. querySQL.setTableAlias("t1");
  765. querySQL.setWhere("t1.itemid", itemids.toArray());
  766. Rows query = querySQL.query();
  767. for (Row row : query) {
  768. boolean istool = row.getBoolean("istool");
  769. if (istool) {
  770. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "添加工具", "添加工具" + row.getString("itemno")).getSQL());
  771. } else {
  772. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "添加产品", "添加产品" + row.getString("itemno")).getSQL());
  773. }
  774. }
  775. dbConnect.runSqlUpdate(sqlList);
  776. SQLFactory sqlFactory = new SQLFactory(this, "合同-产品列表2");
  777. sqlFactory.addParameter("siteid", siteid);
  778. sqlFactory.addParameter("sa_contractid", sa_contractid);
  779. sqlFactory.addParameter_in("itemid", itemids);
  780. String sql = sqlFactory.getSQL();
  781. Rows rows = dbConnect.runSqlQuery(sql);
  782. return getSucReturnObject().setData(rows).toString();
  783. }
  784. @API(title = "删除商品", apiversion = R.ID20221123164502.v1.class)
  785. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20230221151903.v1.class})
  786. public String deleteItem() throws YosException {
  787. Long sa_contractid = content.getLong("sa_contractid");
  788. ArrayList<String> sqlList = new ArrayList<>();
  789. JSONArray sa_contract_itemsids = content.getJSONArray("sa_contract_itemsids");
  790. String sql = "DELETE from sa_contract_items WHERE sa_contract_itemsid in " + sa_contract_itemsids + " and siteid ='" + siteid + "'";
  791. sql = sql.replace("[", "(").replace("]", ")");
  792. sqlList.add(sql);
  793. for (Object obj : sa_contract_itemsids) {
  794. Long sa_contract_itemsid = Long.valueOf(obj.toString());
  795. Row row = getItemRow(sa_contract_itemsid);
  796. String itemno = row.isEmpty() ? "" : row.getString("itemno");
  797. //删除选型配置单
  798. Rows rows = dbConnect.runSqlQuery("SELECT sa_lectotypecfgid from sa_contract_items WHERE sa_contract_itemsid=" + sa_contract_itemsid + " and siteid='" + siteid + "'");
  799. if (rows.isNotEmpty() && rows.get(0).getLong("sa_lectotypecfgid") > 0) {
  800. DeleteSQL deleteSQL = SQLFactory.createDeleteSQL(this, "sa_lectotypecfg");
  801. deleteSQL.setSiteid(siteid);
  802. deleteSQL.setUniqueid(rows.get(0).getLong("sa_lectotypecfgid"));
  803. deleteSQL.setWhere("status", "待评审");
  804. sqlList.add(deleteSQL.getSQL());
  805. }
  806. boolean istool = row.isEmpty() ? false : row.getBoolean("istool");
  807. if (istool) {
  808. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "删除工具", "删除工具" + itemno).getSQL());
  809. } else {
  810. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "删除产品", "删除产品" + itemno).getSQL());
  811. }
  812. }
  813. dbConnect.runSqlUpdate(sqlList);
  814. return getSucReturnObject().toString();
  815. }
  816. @API(title = "添加条款", apiversion = R.ID20221128144502.v1.class)
  817. public String addClause() throws YosException {
  818. Long sa_contractid = content.getLong("sa_contractid");
  819. JSONArray items = content.getJSONArray("items");
  820. String editable = "1";
  821. ArrayList<String> sqlList = new ArrayList<>();
  822. ArrayList<Long> ids = new ArrayList<>();
  823. for (Object obj : items) {
  824. JSONObject item = (JSONObject) obj;
  825. Long id = item.getLong("sa_contract_clauseid");
  826. String contentStr = item.getStringValue("content");
  827. if (id <= 0) {
  828. id = createTableID("sa_contract_clause");
  829. sqlList.add(addContractClauseSql(sa_contractid, id, contentStr, editable));
  830. } else {
  831. sqlList.add(updateContractClauseSql(sa_contractid, id, contentStr));
  832. }
  833. ids.add(id);
  834. }
  835. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "添加", "合同添加条款" + sa_contractid).getSQL());
  836. dbConnect.runSqlUpdate(sqlList);
  837. String sql = "SELECT * from sa_contract_clause WHERE sa_contract_clauseid in " + ids;
  838. sql = sql.replace("[", "(").replace("]", ")");
  839. Rows rows = dbConnect.runSqlQuery(sql);
  840. return getSucReturnObject().setData(rows).toString();
  841. }
  842. @API(title = "删除", apiversion = R.ID20221128160302.v1.class)
  843. public String deleteClause() throws YosException {
  844. JSONArray sa_contract_clauseids = content.getJSONArray("sa_contract_clauseids");
  845. String sql = "DELETE from sa_contract_clause WHERE sa_contract_clauseid in " + sa_contract_clauseids + " and siteid ='" + siteid + "'";
  846. sql = sql.replace("[", "(").replace("]", ")");
  847. dbConnect.runSqlUpdate(sql);
  848. return getSucReturnObject().toString();
  849. }
  850. @API(title = "重置", apiversion = R.ID20221128161602.v1.class)
  851. public String reset() throws YosException {
  852. Long sa_contractid = content.getLong("sa_contractid");
  853. dbConnect.runSqlUpdate("DELETE from sa_contract_clause WHERE sa_contractid = " + sa_contractid);
  854. Rows rows = dbConnect.runSqlQuery("SELECT type,typemx from sa_contract WHERE sa_contractid= " + sa_contractid);
  855. if (rows.isNotEmpty()) {
  856. addContractClause(sa_contractid, rows.get(0).getString("type"), rows.get(0).getString("typemx"));
  857. }
  858. return getSucReturnObject().toString();
  859. }
  860. @API(title = "条款列表", apiversion = R.ID20221128162302.v1.class)
  861. public String clauseList() throws YosException {
  862. Long sa_contractid = content.getLong("sa_contractid");
  863. StringBuffer where = new StringBuffer(" 1=1 ");
  864. if (content.containsKey("where")) {
  865. JSONObject whereObject = content.getJSONObject("where");
  866. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  867. where.append(" and(");
  868. where.append("t1.content like'%").append(whereObject.getString("condition")).append("%' ");
  869. where.append(")");
  870. }
  871. }
  872. SQLFactory sqlFactory = new SQLFactory(this, "合同-条款-列表", pageSize, pageNumber, pageSorting);
  873. sqlFactory.addParameter("siteid", siteid);
  874. sqlFactory.addParameter("sa_contractid", sa_contractid);
  875. sqlFactory.addParameter_SQL("where", where);
  876. String sql = sqlFactory.getSQL();
  877. Rows rows = dbConnect.runSqlQuery(sql);
  878. return getSucReturnObject().setData(rows).toString();
  879. }
  880. @API(title = "业绩目标", apiversion = R.ID20221209150102.v1.class)
  881. @CACHEING
  882. public String getTarget() throws YosException {
  883. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  884. Long sa_contractid = content.getLong("sa_contractid");
  885. StringBuffer where = new StringBuffer(" 1=1 ");
  886. if (content.containsKey("where")) {
  887. JSONObject whereObject = content.getJSONObject("where");
  888. if (whereObject.containsKey("year") && !"".equals(whereObject.getString("year"))) {
  889. where.append(" and(");
  890. where.append("year ='").append(whereObject.getString("year")).append("' ");
  891. where.append(")");
  892. }
  893. if (whereObject.containsKey("tradefield") && !"".equals(whereObject.getString("tradefield"))) {
  894. where.append(" and(");
  895. where.append("tradefield ='").append(whereObject.getString("tradefield")).append("' ");
  896. where.append(")");
  897. }
  898. }
  899. SQLFactory sqlFactory = new SQLFactory(this, "合同-业绩目标");
  900. sqlFactory.addParameter("siteid", siteid);
  901. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  902. sqlFactory.addParameter("sa_contractid", sa_contractid);
  903. sqlFactory.addParameter_SQL("where", where);
  904. String sql = sqlFactory.getSQL();
  905. Rows rows = dbConnect.runSqlQuery(sql);
  906. return getSucReturnObject().setData(rows).toString();
  907. }
  908. @API(title = "终止合同", apiversion = R.ID20221212102802.v1.class)
  909. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20221223102102.v1.class, R.ID20230713132804.class},
  910. apiClass = {DataDashboards.class, customersdata.class})
  911. public String endContract() throws YosException {
  912. Long sa_contractid = content.getLong("sa_contractid");
  913. ArrayList<String> sqlList = new ArrayList<>();
  914. String sql = "SELECT sys_enterpriseid,status from sa_contract WHERE sa_contractid =" + sa_contractid + " and siteid = '" + siteid + "'";
  915. Rows rows = dbConnect.runSqlQuery(sql);
  916. if (rows.isEmpty()) {
  917. return getReturnObject().setCode("0204", new String[0]).toString();//未找到终止合同
  918. }
  919. Long sys_enterpriseid = rows.get(0).getLong("sys_enterpriseid");
  920. sqlList.add("UPDATE sa_contract SET `status`='已终止' WHERE sa_contractid =" + sa_contractid + " and siteid = '" + siteid + "'");
  921. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "终止", "终止合同" + getBillNo(sa_contractid)).getSQL());
  922. dbConnect.runSqlUpdate(sqlList);
  923. updateCustomerStatus(sa_contractid, sys_enterpriseid);
  924. return getSucReturnObject().toString();
  925. }
  926. @API(title = "查询我负责的项目合同列表", apiversion = R.ID20221217145402.v1.class)
  927. public String getMyInChargeProjectContract() throws YosException {
  928. StringBuffer where = new StringBuffer(" 1=1 ");
  929. Long sa_projectid = 0L;
  930. if (content.containsKey("where")) {
  931. JSONObject whereObject = content.getJSONObject("where");
  932. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  933. where.append(" and (");
  934. where.append("t1.title like '%").append(whereObject.getString("condition")).append("%' ");
  935. where.append("or t1.billno like '%").append(whereObject.getString("condition")).append("%' ");
  936. where.append("or t2.projectname like '%").append(whereObject.getString("condition")).append("%' ");
  937. where.append("or t2.projectnum like '%").append(whereObject.getString("condition")).append("%' ");
  938. where.append("or t3.name like '%").append(whereObject.getString("condition")).append("%' ");
  939. where.append(" )");
  940. }
  941. //查询指定项目下的我负责的项目合同列表
  942. if (whereObject.containsKey("sa_projectid") && !"".equals(whereObject.getString("sa_projectid"))) {
  943. sa_projectid = whereObject.getLongValue("sa_projectid");
  944. where.append(" and(t1.sa_projectid = '").append(sa_projectid).append("')");
  945. }
  946. }
  947. //项目商机中
  948. if (sa_projectid > 0) {
  949. //当前项目负责人的合同
  950. where.append(" and t1.sa_contractid in ( SELECT ownerid FROM sys_datateam WHERE ownertable='sa_contract' AND isleader=1 AND siteid='");
  951. where.append(siteid);
  952. where.append("' AND userid IN (SELECT userid FROM sys_datateam WHERE ownertable='sa_project' AND isleader=1 AND siteid='");
  953. where.append(siteid);
  954. where.append("' AND ownerid='");
  955. where.append(sa_projectid).append("'))");
  956. } else {
  957. //合同中使用
  958. //业务员
  959. // if (isSaler()) {
  960. // //选择操作人负责的项目合同(包括经销、直销项目合同)
  961. // where = " (" + where + ") and (" + DataTeam.getDataWhereStr(this, "sa_contract", "t1", 1) + ")";
  962. // } else {
  963. // //选择操作人参与团队的负责人的名下负责的项目合同(包括经销、直销项目合同)
  964. // where = " (" + where + ") and (" + getDataWhereStr(this, "sa_contract", "t1") + ")";
  965. // }
  966. // ArrayList<Long> userids = DataTeam.getProxyUserids(this);
  967. //
  968. // where = " (" + where + ") and (" + getDataWhereStr(this, userids, "sa_contract", "t1") + " )";
  969. where.append(" and (");
  970. where.append("(").append(DataTeam.getDataWhereStr(this, "sa_contract", "t1", 1)).append(")");
  971. where.append(" or (").append(DataTeam.getDataWhereStr(this, "sa_contract", "t1", 2)).append(")");
  972. where.append(")");
  973. }
  974. SQLFactory sqlFactory = new SQLFactory(this, "项目合同列表", pageSize, pageNumber, pageSorting);
  975. sqlFactory.addParameter("siteid", siteid);
  976. sqlFactory.addParameter_SQL("where", where);
  977. String sql = sqlFactory.getSQL();
  978. Rows rows = dbConnect.runSqlQuery(sql);
  979. //查询居间商信息
  980. ArrayList<Long> sa_projectids = rows.toArrayList("sa_projectid", new ArrayList<>());
  981. sqlFactory = new SQLFactory(this, "查询项目居间商信息");
  982. sqlFactory.addParameter_in("sa_projectid", sa_projectids);
  983. sqlFactory.addParameter("siteid", siteid);
  984. RowsMap rowsMap = dbConnect.runSqlQuery(sqlFactory.getSQL()).toRowsMap("sa_projectid");
  985. for (Row row : rows) {
  986. row.put("parties", rowsMap.getOrDefault(row.getString("sa_projectid"), new Rows()));
  987. }
  988. return getSucReturnObject().setData(rows).toString();
  989. }
  990. @API(title = "查询我负责的客户合同列表", apiversion = R.ID20240509112704.v1.class)
  991. public String getMyInChargeCustomersContract() throws YosException {
  992. StringBuffer where = new StringBuffer(" 1=1 ");
  993. if (content.containsKey("where")) {
  994. JSONObject whereObject = content.getJSONObject("where");
  995. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  996. where.append(" and (");
  997. where.append("t1.title like '%").append(whereObject.getString("condition")).append("%'");
  998. where.append("or t1.billno like '%").append(whereObject.getString("condition")).append("%'");
  999. where.append("or t2.enterprisename like '%").append(whereObject.getString("condition")).append("%'");
  1000. where.append("or t3.name like '%").append(whereObject.getString("condition")).append("%'");
  1001. where.append(")");
  1002. }
  1003. }
  1004. where.append(" and (");
  1005. where.append("(").append(DataTeam.getDataWhereStr(this, "sa_contract", "t1", 1)).append(")");
  1006. where.append(" or (").append(DataTeam.getDataWhereStr(this, "sa_contract", "t1", 2)).append(")");
  1007. where.append(")");
  1008. SQLFactory sqlFactory = new SQLFactory(this, "客户合同列表", pageSize, pageNumber, pageSorting);
  1009. sqlFactory.addParameter("siteid", siteid);
  1010. sqlFactory.addParameter_SQL("where", where);
  1011. String sql = sqlFactory.getSQL();
  1012. Rows rows = dbConnect.runSqlQuery(sql);
  1013. return getSucReturnObject().setData(rows).toString();
  1014. }
  1015. //选择操作人及代理人负责的项目合同(包括经销、直销项目合同)
  1016. public static String getDataWhereStr(Controller controller, ArrayList<Long> userids, String ownertable, String alias) throws YosException {
  1017. String str = " exists(select sys_datateamid from sys_datateam where siteid='" + controller.siteid +
  1018. "' and isleader=1 and userid in " + userids + " and ownertable='" + ownertable + "' and ownerid=" + alias + "." + controller.getuniquecolumnname(ownertable) + " )";
  1019. str = str.replace("[", "(").replace("]", ")");
  1020. return str;
  1021. }
  1022. @API(title = "查询经销商的合同列表", apiversion = R.ID20221219141702.v1.class)
  1023. @CACHEING
  1024. public String getAgentContract() throws YosException {
  1025. String where = " 1=1 ";
  1026. if (content.containsKey("where")) {
  1027. JSONObject whereObject = content.getJSONObject("where");
  1028. if (whereObject.containsKey("condition") && !"".equals(whereObject.getString("condition"))) {
  1029. where = where + " and(t1.sa_contractid like '%" + whereObject.getString("condition")
  1030. + "%' or t1.title like '%" + whereObject.getString("condition")
  1031. + "%' or t1.billno like '%" + whereObject.getString("condition")
  1032. + "%' or t3.projectname like '%" + whereObject.getString("condition") + "%')";
  1033. }
  1034. }
  1035. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  1036. SQLFactory sqlFactory = new SQLFactory(this, "查询经销商的合同列表", pageSize, pageNumber, pageSorting);
  1037. sqlFactory.addParameter("siteid", siteid);
  1038. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  1039. sqlFactory.addParameter_SQL("where", where);
  1040. String sql = sqlFactory.getSQL();
  1041. Rows rows = dbConnect.runSqlQuery(sql);
  1042. ArrayList<Long> ids = rows.toArrayList("sa_contractid", new ArrayList<>());
  1043. //查询价格
  1044. RowsMap signAmountRowsMap = beans.contract.Contract.getContractSignAmount(this, ids);
  1045. for (Row row : rows) {
  1046. Long id = row.getLong("sa_contractid");
  1047. if (signAmountRowsMap.get(id.toString()).isNotEmpty()) {
  1048. row.put("signamount", signAmountRowsMap.get(id.toString()).get(0).getBigDecimal("signamount").toPlainString());
  1049. } else {
  1050. row.put("signamount", 0);
  1051. }
  1052. }
  1053. return getSucReturnObject().setData(rows).toString();
  1054. }
  1055. @API(title = "保存合同条款信息", apiversion = R.ID20230117112002.v1.class)
  1056. public String setContractclause() throws YosException {
  1057. Long sa_contractid = content.getLong("sa_contractid");
  1058. JSONObject dataextend = content.getJSONObject("dataextend");
  1059. String deliverymode = content.getStringValue("deliverymode");
  1060. String paytype = content.getStringValue("paytype");
  1061. JSONObject parta = content.getJSONObject("parta");
  1062. JSONObject partb = content.getJSONObject("partb");
  1063. SQLFactory sqlFactory = new SQLFactory(this, "保存甲乙合同条款信息");
  1064. sqlFactory.addParameter("siteid", siteid);
  1065. sqlFactory.addParameter("userid", userid);
  1066. sqlFactory.addParameter("username", username);
  1067. sqlFactory.addParameter("sa_contractid", sa_contractid);
  1068. sqlFactory.addParameter("dataextend", dataextend);
  1069. sqlFactory.addParameter("deliverymode", deliverymode);
  1070. sqlFactory.addParameter("paytype", paytype);
  1071. sqlFactory.addParameter("parta", parta);
  1072. sqlFactory.addParameter("partb", partb);
  1073. String sql = sqlFactory.getSQL();
  1074. dbConnect.runSqlUpdate(sql);
  1075. return getContractclause();
  1076. }
  1077. @API(title = "获取合同条款信息", apiversion = R.ID20230117112102.v1.class)
  1078. public String getContractclause() throws YosException {
  1079. Long sa_contractid = content.getLong("sa_contractid");
  1080. Long sys_enterpriseid = content.getLong("sys_enterpriseid");
  1081. SQLFactory sqlFactory = new SQLFactory(this, "查询甲乙合同条款信息");
  1082. sqlFactory.addParameter("siteid", siteid);
  1083. sqlFactory.addParameter("sa_contractid", sa_contractid);
  1084. String sql = sqlFactory.getSQL();
  1085. Rows rows = dbConnect.runSqlQuery(sql);
  1086. for (Row row : rows) {
  1087. //已方
  1088. if (row.getJSONObject("partb").isEmpty()) {
  1089. JSONObject obj = new JSONObject();
  1090. obj.put("freightpayer", "0");
  1091. row.put("partb", obj);
  1092. sqlFactory = new SQLFactory(this, "查询企业落款信息");
  1093. sqlFactory.addParameter("siteid", siteid);
  1094. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  1095. Rows rowsA = dbConnect.runSqlQuery(sqlFactory);
  1096. JSONObject objectA = row.getJSONObject("partb");
  1097. if (rowsA.isNotEmpty()) {
  1098. objectA.putAll(rowsA.get(0));
  1099. }
  1100. row.put("partb", objectA);
  1101. }
  1102. //甲方
  1103. if (row.getJSONObject("parta").isEmpty()) {
  1104. JSONObject obj = new JSONObject();
  1105. obj.put("freightpayer", "1");
  1106. row.getJSONObject("parta").put("parta", obj);
  1107. sqlFactory = new SQLFactory(this, "查询当前站点企业落款信息");
  1108. sqlFactory.addParameter("siteid", siteid);
  1109. Rows rowsB = dbConnect.runSqlQuery(sqlFactory);
  1110. JSONObject objectB = row.getJSONObject("parta");
  1111. if (rowsB.isNotEmpty()) {
  1112. objectB.putAll(rowsB.get(0));
  1113. }
  1114. row.put("parta", objectB);
  1115. }
  1116. //扩展信息
  1117. if (row.getJSONObject("dataextend").isEmpty()) {
  1118. JSONObject obj = new JSONObject();
  1119. obj.put("pressure", "");
  1120. row.put("dataextend", obj);
  1121. }
  1122. }
  1123. return getSucReturnObject().setData(rows.isNotEmpty() ? rows.get(0) : new Row()).toString();
  1124. }
  1125. @API(title = "查询企业落款信息", apiversion = R.ID20230118150402.v1.class)
  1126. public String selectSignInfo() throws YosException {
  1127. if (content.containsKey("sys_enterpriseid")) {
  1128. sys_enterpriseid = content.getLongValue("sys_enterpriseid");
  1129. }
  1130. SQLFactory sqlFactory = new SQLFactory(this, "查询企业落款信息");
  1131. sqlFactory.addParameter("siteid", siteid);
  1132. sqlFactory.addParameter("sys_enterpriseid", sys_enterpriseid);
  1133. Rows rows = dbConnect.runSqlQuery(sqlFactory);
  1134. return getSucReturnObject().setData(rows).toString();
  1135. }
  1136. @API(title = "产品信息同步合作协议", apiversion = R.ID20231204153904.v1.class)
  1137. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class}, apiClass = Contract.class)
  1138. public String synchronousContractItems() throws YosException {
  1139. Long sa_contractid = content.getLong("sa_contractid");
  1140. Rows contractRows = dbConnect.runSqlQuery("select * from sa_contract where siteid='" + siteid + "' and sa_contractid=" + sa_contractid);
  1141. if (contractRows.isEmpty()) {
  1142. return getReturnObject().setCode("0205", new String[0]).toString();//无效合同
  1143. }
  1144. String type = contractRows.get(0).getString("type");
  1145. if (!type.equals("项目")) {
  1146. return getReturnObject().setCode("0206", new String[0]).toString();//该类型合同无此功能
  1147. }
  1148. Long sys_enterpriseid = contractRows.get(0).getLong("sys_enterpriseid");
  1149. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_contract", "sa_contractid");
  1150. querySQL.setTableAlias("t1");
  1151. querySQL.setSiteid(siteid);
  1152. querySQL.setWhere("t1.status ='审核' and t1.enddate >= current_date and t1.sys_enterpriseid=" + sys_enterpriseid + " and type in ('框架','直销')");
  1153. Rows query = querySQL.query();
  1154. if (query.isEmpty()) {
  1155. return getReturnObject().setCode("0207", new String[0]).toString();//当前企业不存在经销商合作协议或者直销客户合作协议
  1156. }
  1157. querySQL = SQLFactory.createQuerySQL(this, "sa_contract_items");
  1158. querySQL.setTableAlias("t1");
  1159. querySQL.setSiteid(siteid);
  1160. querySQL.setWhere("sa_contractid", query.get(0).getLong("sa_contractid"));
  1161. Rows contactitemsRows = querySQL.query();
  1162. if (contactitemsRows.isEmpty()) {
  1163. return getSucReturnObject().toString();
  1164. }
  1165. RowsMap contactItemsRowsMap = contactitemsRows.toRowsMap("itemid");
  1166. querySQL = SQLFactory.createQuerySQL(this, "sa_contract_items");
  1167. querySQL.setTableAlias("t1");
  1168. querySQL.setSiteid(siteid);
  1169. querySQL.setWhere("sa_contractid", sa_contractid);
  1170. contactitemsRows = querySQL.query();
  1171. Boolean isadd = content.getBoolean("isadd");
  1172. ArrayList<String> sqlList = new ArrayList<>();
  1173. for (Row row : contactitemsRows) {
  1174. String itemid = row.getString("itemid");
  1175. if (contactItemsRowsMap.containsKey(itemid)) {
  1176. Row stayItemsRow = contactItemsRowsMap.get(itemid).get(0);
  1177. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "sa_contract_items");
  1178. updateSQL.setValue("changeuserid", userid);
  1179. updateSQL.setValue("changeby", username);
  1180. updateSQL.setDateValue("changedate");
  1181. updateSQL.setValue("type", stayItemsRow.getString("type"));
  1182. updateSQL.setValue("discountrate", stayItemsRow.getBigDecimal("discountrate"));
  1183. updateSQL.setValue("price", stayItemsRow.getBigDecimal("price"));
  1184. updateSQL.setValue("qty", stayItemsRow.getBigDecimal("qty"));
  1185. updateSQL.setValue("marketprice", stayItemsRow.getBigDecimal("marketprice"));
  1186. updateSQL.setSiteid(siteid);
  1187. updateSQL.setWhere("itemid", itemid);
  1188. updateSQL.setWhere("sa_contractid", sa_contractid);
  1189. sqlList.add(updateSQL.getSQL());
  1190. contactItemsRowsMap.remove(itemid);
  1191. }
  1192. }
  1193. if (isadd) {
  1194. long[] sa_contract_items = createTableID("sa_contract_items", contactItemsRowsMap.size());
  1195. int i = 0;
  1196. for (String itemid : contactItemsRowsMap.keySet()) {
  1197. Row stayItemsRow = contactItemsRowsMap.get(itemid).get(0);
  1198. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_contract_items");
  1199. insertSQL.setValue("sa_contract_itemsid", sa_contract_items[i]);
  1200. insertSQL.setValue("siteid", siteid);
  1201. insertSQL.setValue("createby", username);
  1202. insertSQL.setDateValue("createdate");
  1203. insertSQL.setValue("changeuserid", userid);
  1204. insertSQL.setValue("changeby", username);
  1205. insertSQL.setDateValue("changedate");
  1206. insertSQL.setValue("createuserid", userid);
  1207. insertSQL.setValue("sa_contractid", sa_contractid);
  1208. insertSQL.setValue("itemid", itemid);
  1209. insertSQL.setValue("type", stayItemsRow.getString("type"));
  1210. insertSQL.setValue("discountrate", stayItemsRow.getBigDecimal("discountrate"));
  1211. insertSQL.setValue("price", stayItemsRow.getBigDecimal("price"));
  1212. insertSQL.setValue("qty", stayItemsRow.getBigDecimal("qty"));
  1213. insertSQL.setValue("marketprice", stayItemsRow.getBigDecimal("marketprice"));
  1214. sqlList.add(insertSQL.getSQL());
  1215. i++;
  1216. }
  1217. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "同步框架协议产品", "同步合作协议的产品").getSQL());
  1218. } else {
  1219. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "同步框架协议产品", "同步合作协议的产品折扣价格").getSQL());
  1220. }
  1221. dbConnect.runSqlUpdate(sqlList);
  1222. return getSucReturnObject().toString();
  1223. }
  1224. @API(title = "居间合同产品信息同步关联合同", apiversion = R.ID20240518155604.v1.class)
  1225. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class}, apiClass = Contract.class)
  1226. public String JJsynchronousContractItems() throws YosException {
  1227. Long sa_contractid = content.getLong("sa_contractid");
  1228. Rows contractRows = dbConnect.runSqlQuery("select * from sa_contract where siteid='" + siteid + "' and sa_contractid=" + sa_contractid);
  1229. if (contractRows.isEmpty()) {
  1230. return getReturnObject().setCode("0205", new String[0]).toString();//无效合同
  1231. }
  1232. String type = contractRows.get(0).getString("type");
  1233. if (!type.equals("居间")) {
  1234. return getReturnObject().setCode("0206", new String[0]).toString();//该类型合同无此功能
  1235. }
  1236. Long ascription_contractid = contractRows.get(0).getLong("ascription_contractid");
  1237. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_contract_items");
  1238. querySQL.setTableAlias("t1");
  1239. querySQL.setSiteid(siteid);
  1240. querySQL.setWhere("sa_contractid", ascription_contractid);
  1241. Rows contactitemsRows = querySQL.query();
  1242. if (contactitemsRows.isEmpty()) {
  1243. return getSucReturnObject().toString();
  1244. }
  1245. RowsMap contactItemsRowsMap = contactitemsRows.toRowsMap("itemid");
  1246. querySQL = SQLFactory.createQuerySQL(this, "sa_contract_items");
  1247. querySQL.setTableAlias("t1");
  1248. querySQL.setSiteid(siteid);
  1249. querySQL.setWhere("sa_contractid", sa_contractid);
  1250. contactitemsRows = querySQL.query();
  1251. ArrayList<String> sqlList = new ArrayList<>();
  1252. for (Row row : contactitemsRows) {
  1253. String itemid = row.getString("itemid");
  1254. if (contactItemsRowsMap.containsKey(itemid)) {
  1255. Row stayItemsRow = contactItemsRowsMap.get(itemid).get(0);
  1256. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "sa_contract_items");
  1257. updateSQL.setValue("changeuserid", userid);
  1258. updateSQL.setValue("changeby", username);
  1259. updateSQL.setDateValue("changedate");
  1260. updateSQL.setValue("type", stayItemsRow.getString("type"));
  1261. updateSQL.setValue("discountrate", stayItemsRow.getBigDecimal("discountrate"));
  1262. updateSQL.setValue("price", stayItemsRow.getBigDecimal("price"));
  1263. updateSQL.setValue("qty", stayItemsRow.getBigDecimal("qty"));
  1264. updateSQL.setValue("marketprice", stayItemsRow.getBigDecimal("marketprice"));
  1265. updateSQL.setSiteid(siteid);
  1266. updateSQL.setWhere("itemid", itemid);
  1267. updateSQL.setWhere("sa_contractid", sa_contractid);
  1268. sqlList.add(updateSQL.getSQL());
  1269. contactItemsRowsMap.remove(itemid);
  1270. }
  1271. }
  1272. long[] sa_contract_items = createTableID("sa_contract_items", contactItemsRowsMap.size());
  1273. int i = 0;
  1274. for (String itemid : contactItemsRowsMap.keySet()) {
  1275. Row stayItemsRow = contactItemsRowsMap.get(itemid).get(0);
  1276. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_contract_items");
  1277. insertSQL.setValue("sa_contract_itemsid", sa_contract_items[i]);
  1278. insertSQL.setValue("siteid", siteid);
  1279. insertSQL.setValue("createby", username);
  1280. insertSQL.setDateValue("createdate");
  1281. insertSQL.setValue("changeuserid", userid);
  1282. insertSQL.setValue("changeby", username);
  1283. insertSQL.setDateValue("changedate");
  1284. insertSQL.setValue("createuserid", userid);
  1285. insertSQL.setValue("sa_contractid", sa_contractid);
  1286. insertSQL.setValue("itemid", itemid);
  1287. insertSQL.setValue("type", stayItemsRow.getString("type"));
  1288. insertSQL.setValue("discountrate", stayItemsRow.getBigDecimal("discountrate"));
  1289. insertSQL.setValue("price", stayItemsRow.getBigDecimal("price"));
  1290. insertSQL.setValue("qty", stayItemsRow.getBigDecimal("qty"));
  1291. insertSQL.setValue("marketprice", stayItemsRow.getBigDecimal("marketprice"));
  1292. sqlList.add(insertSQL.getSQL());
  1293. i++;
  1294. }
  1295. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "同步关联合同产品", "同步关联合同的产品").getSQL());
  1296. dbConnect.runSqlUpdate(sqlList);
  1297. return getSucReturnObject().toString();
  1298. }
  1299. @API(title = "居间合同产品类别信息同步关联合同", apiversion = R.ID20240518160504.v1.class)
  1300. @CACHEING_CLEAN(apiversions = {R.ID20221124135602.class, R.ID20221124140102.v1.class, R.ID20230219202203.v1.class}, apiClass = Contract.class)
  1301. public String JJsynchronousContractItemsClass() throws YosException {
  1302. Long sa_contractid = content.getLong("sa_contractid");
  1303. Rows contractRows = dbConnect.runSqlQuery("select * from sa_contract where siteid='" + siteid + "' and sa_contractid=" + sa_contractid);
  1304. if (contractRows.isEmpty()) {
  1305. return getReturnObject().setCode("0205", new String[0]).toString();//无效合同
  1306. }
  1307. String type = contractRows.get(0).getString("type");
  1308. if (!type.equals("居间")) {
  1309. return getReturnObject().setCode("0206", new String[0]).toString();//该类型合同无此功能
  1310. }
  1311. Long ascription_contractid = contractRows.get(0).getLong("ascription_contractid");
  1312. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_contract_itemsaleclass");
  1313. querySQL.setTableAlias("t1");
  1314. querySQL.setSiteid(siteid);
  1315. querySQL.setWhere("sa_contractid", ascription_contractid);
  1316. Rows contactitemssaleclassRows = querySQL.query();
  1317. if (contactitemssaleclassRows.isEmpty()) {
  1318. return getSucReturnObject().toString();
  1319. }
  1320. RowsMap contactItemsSaleClassRowsMap = contactitemssaleclassRows.toRowsMap("itemclassid");
  1321. querySQL = SQLFactory.createQuerySQL(this, "sa_contract_itemsaleclass");
  1322. querySQL.setTableAlias("t1");
  1323. querySQL.setSiteid(siteid);
  1324. querySQL.setWhere("sa_contractid", sa_contractid);
  1325. contactitemssaleclassRows = querySQL.query();
  1326. ArrayList<String> sqlList = new ArrayList<>();
  1327. for (Row row : contactitemssaleclassRows) {
  1328. String itemclassid = row.getString("itemclassid");
  1329. if (contactItemsSaleClassRowsMap.containsKey(itemclassid)) {
  1330. Row stayItemsSaleClassRow = contactItemsSaleClassRowsMap.get(itemclassid).get(0);
  1331. UpdateSQL updateSQL = SQLFactory.createUpdateSQL(this, "sa_contract_itemsaleclass");
  1332. updateSQL.setValue("changeuserid", userid);
  1333. updateSQL.setValue("changeby", username);
  1334. updateSQL.setDateValue("changedate");
  1335. updateSQL.setValue("discountrate", stayItemsSaleClassRow.getBigDecimal("discountrate"));
  1336. updateSQL.setValue("remarks", stayItemsSaleClassRow.getString("remarks"));
  1337. updateSQL.setSiteid(siteid);
  1338. updateSQL.setWhere("itemclassid", itemclassid);
  1339. updateSQL.setWhere("sa_contractid", sa_contractid);
  1340. sqlList.add(updateSQL.getSQL());
  1341. contactItemsSaleClassRowsMap.remove(itemclassid);
  1342. }
  1343. }
  1344. long[] sa_contract_itemssaleclass = createTableID("sa_contract_itemsaleclass", contactItemsSaleClassRowsMap.size());
  1345. int i = 0;
  1346. for (String itemclassid : contactItemsSaleClassRowsMap.keySet()) {
  1347. Row stayItemsSaleClassRow = contactItemsSaleClassRowsMap.get(itemclassid).get(0);
  1348. InsertSQL insertSQL = SQLFactory.createInsertSQL(this, "sa_contract_itemsaleclass");
  1349. insertSQL.setValue("sa_contract_itemsaleclassid", sa_contract_itemssaleclass[i]);
  1350. insertSQL.setValue("siteid", siteid);
  1351. insertSQL.setValue("createby", username);
  1352. insertSQL.setDateValue("createdate");
  1353. insertSQL.setValue("changeuserid", userid);
  1354. insertSQL.setValue("changeby", username);
  1355. insertSQL.setDateValue("changedate");
  1356. insertSQL.setValue("createuserid", userid);
  1357. insertSQL.setValue("sa_contractid", sa_contractid);
  1358. insertSQL.setValue("itemclassid", itemclassid);
  1359. insertSQL.setValue("discountrate", stayItemsSaleClassRow.getBigDecimal("discountrate"));
  1360. insertSQL.setValue("remarks", stayItemsSaleClassRow.getString("remarks"));
  1361. sqlList.add(insertSQL.getSQL());
  1362. i++;
  1363. }
  1364. sqlList.add(DataContrlLog.createLog(this, "sa_contract", sa_contractid, "同步关联合同产品类别", "同步关联合同的产品类别").getSQL());
  1365. dbConnect.runSqlUpdate(sqlList);
  1366. return getSucReturnObject().toString();
  1367. }
  1368. @API(title = "批量修改类型", apiversion = R.ID20240110154404.v1.class)
  1369. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20230221151903.v1.class})
  1370. public String updateType() throws YosException {
  1371. Long sa_contractid = content.getLong("sa_contractid");
  1372. JSONArray sa_contract_itemsids = content.getJSONArray("sa_contract_itemsids");
  1373. String type = content.getString("type");
  1374. if (content.getBooleanValue("isAll")) {
  1375. dbConnect.runSqlUpdate("update sa_contract_items set type='" + type + "' where siteid='" + siteid + "' and sa_contractid=" + sa_contractid);
  1376. } else {
  1377. sa_contract_itemsids.add("-1");
  1378. String replace = sa_contract_itemsids.toString().replace("[", "(").replace("]", ")");
  1379. dbConnect.runSqlUpdate("update sa_contract_items set type='" + type + "' where siteid='" + siteid + "' and sa_contract_itemsid in " + replace);
  1380. }
  1381. return getSucReturnObject().toString();
  1382. }
  1383. @API(title = "下载导入模板", apiversion = R.ID20230314133304.v1.class)
  1384. public String downloadExcel() throws YosException {
  1385. ExcelFactory excelFactory = new ExcelFactory("商品明细导入模板");
  1386. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet("Sheet1");
  1387. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  1388. CellStyle style = xssfFWorkbook.createCellStyle();
  1389. DataFormat format = xssfFWorkbook.createDataFormat();
  1390. style.setDataFormat(format.getFormat("@"));
  1391. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1392. for (int i = 0; i <= 2; i++) {
  1393. sheet.setDefaultColumnStyle(i, style);
  1394. }
  1395. // 设置工作薄列宽
  1396. ExportExcel.setBatchDetailSheetColumn1(sheet);// 设置工作薄列宽
  1397. XSSFCellStyle titleCellStyle1 = ExportExcel.createTitleCellStyle1(xssfFWorkbook);
  1398. XSSFCellStyle titleCellStyle2 = ExportExcel.createTitleCellStyle2(xssfFWorkbook);
  1399. XSSFCellStyle titleCellStyle3 = ExportExcel.createTitleCellStyle3(xssfFWorkbook);
  1400. XSSFCellStyle titleCellStyle4 = ExportExcel.createBodyCellStyle4(xssfFWorkbook);
  1401. ExportExcel.batchDetail(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, titleCellStyle4, xssfFWorkbook);
  1402. Rows aa = uploadExcelToObs(excelFactory);
  1403. String url = "";
  1404. if (!aa.isEmpty()) {
  1405. url = aa.get(0).getString("url");
  1406. }
  1407. return getSucReturnObject().setData(url).toString();
  1408. }
  1409. @API(title = "合同商品价格协议导入", apiversion = R.ID20230314133404.v1.class)
  1410. @CACHEING_CLEAN(apiversions = {R.ID20221219141702.v1.class, R.ID20221121195102.class, R.ID20221121201502.class, R.ID20221122165302.class, R.ID20230221151903.v1.class})
  1411. public String importItems() throws YosException {
  1412. Long sa_contractid = content.getLong("sa_contractid");
  1413. Rows contract = dbConnect.runSqlQuery("select status from sa_contract where siteid='" + siteid + "' and deleted=0 and sa_contractid=" + sa_contractid);
  1414. if (contract.isEmpty()) {
  1415. return getReturnObject().setCode("0205", new String[0]).toString();//无效合同
  1416. }
  1417. if (!contract.get(0).getString("status").equals("新建")) {
  1418. return getReturnObject().setCode("0209", new String[0]).toString();//非新建状态不能导入
  1419. }
  1420. ArrayList<String> sqlList = new ArrayList<>();
  1421. ExcelFactory e;
  1422. try {
  1423. // 华为云
  1424. e = getPostExcelFactory(content.getLong("attachmentid"));
  1425. // 本地
  1426. //e = getPostExcelFactory();
  1427. ArrayList<String> keys = new ArrayList<>();
  1428. keys.add("itemno");
  1429. keys.add("type");
  1430. keys.add("value");
  1431. HashMap<String, CellType> cellmap = new HashMap<>();
  1432. cellmap.put("itemno", CellType.STRING);
  1433. cellmap.put("value", CellType.STRING);
  1434. Rows rows = e.getSheetRows(0, keys, cellmap, 3);
  1435. boolean iserr = false;
  1436. Rows rowserr = new Rows();
  1437. Rows rowssuc = new Rows();
  1438. ArrayList<String> itemnoList = rows.toArrayList("itemno");
  1439. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "plm_item", "itemid", "itemno", "marketprice", "orderminqty");
  1440. querySQL.setTableAlias("t1");
  1441. querySQL.setSiteid(siteid);
  1442. querySQL.setWhere("itemno", itemnoList.toArray());
  1443. querySQL.setWhere("isshow=1");
  1444. Rows itemsRows = querySQL.query();
  1445. RowsMap itemRowsMap = itemsRows.toRowsMap("itemno");
  1446. ArrayList<Long> itemidList = dbConnect.runSqlQuery("select itemid from sa_contract_items where siteid='" + siteid + "' and sa_contractid=" + sa_contractid).toArrayList("itemid", new ArrayList<>());
  1447. RowsMap imtitemRowsMap = rows.toRowsMap("itemno");
  1448. for (Row row : rows) {
  1449. String itemno = row.getString("itemno");
  1450. String type = row.getString("type");
  1451. String value = row.getString("value");
  1452. try {
  1453. new BigDecimal(value);
  1454. } catch (Exception exception) {
  1455. iserr = true;
  1456. row.put("msg", "错误信息:数值格式错误");
  1457. rowserr.add(row);
  1458. continue;
  1459. }
  1460. if (StringUtils.isEmpty(itemno)
  1461. || StringUtils.isEmpty(type)
  1462. || StringUtils.isEmpty(value)) {
  1463. iserr = true;
  1464. row.put("msg", "错误信息:商品编号/类型/值不能为空");
  1465. rowserr.add(row);
  1466. continue;
  1467. }
  1468. if (imtitemRowsMap.get(itemno).size() > 1) {
  1469. iserr = true;
  1470. row.put("msg", "错误信息:本次导入存在重复商品");
  1471. rowserr.add(row);
  1472. continue;
  1473. }
  1474. if (!itemRowsMap.containsKey(itemno)) {
  1475. iserr = true;
  1476. row.put("msg", "错误信息:商品不存在");
  1477. rowserr.add(row);
  1478. continue;
  1479. } else {
  1480. Row itemRow = itemRowsMap.get(itemno).get(0);
  1481. BigDecimal marketprice = itemRow.getBigDecimal("marketprice");
  1482. if (marketprice.compareTo(BigDecimal.ZERO) == 0) {
  1483. iserr = true;
  1484. row.put("msg", "错误信息:商品牌价为0");
  1485. rowserr.add(row);
  1486. continue;
  1487. }
  1488. row.put("itemid", itemRow.getLong("itemid"));
  1489. row.put("marketprice", itemRow.getBigDecimal("marketprice"));
  1490. row.put("orderminqty", itemRow.getBigDecimal("orderminqty"));
  1491. }
  1492. if (itemidList.contains(row.getLong("itemid"))) {
  1493. iserr = true;
  1494. row.put("msg", "错误信息:商品已存在价格协议中");
  1495. rowserr.add(row);
  1496. continue;
  1497. }
  1498. if (!type.equals("折扣系数") && !type.equals("指定单价")) {
  1499. iserr = true;
  1500. row.put("msg", "错误信息:类型不存在");
  1501. rowserr.add(row);
  1502. continue;
  1503. }
  1504. rowssuc.add(row);
  1505. }
  1506. if (!rowssuc.isEmpty()) {
  1507. HashMap<Long, ItemPrice> itemPrice = ItemPrice.getItemPrice(this, sys_enterpriseid, rowssuc.toArrayList("itemid", new ArrayList<Long>()));
  1508. for (Row row : rowssuc) {
  1509. BigDecimal value = BigDecimal.valueOf(row.getDouble("value"));
  1510. BigDecimal marketprice = itemPrice.get(row.getLong("itemid")).getMarketprice();
  1511. if (row.getString("type").equals("折扣系数")) {
  1512. row.put("discountrate", value);
  1513. row.put("price", marketprice.multiply(value));
  1514. } else {
  1515. row.put("price", value);
  1516. row.put("discountrate", value.divide(marketprice, 4, RoundingMode.HALF_UP));
  1517. }
  1518. sqlList.add(addItemSql(sa_contractid, row.getLong("itemid"), row.getBigDecimal("price"), row.getBigDecimal("discountrate"), row.getBigDecimal("orderminqty"), marketprice, row.getString("type")));
  1519. }
  1520. }
  1521. if (!sqlList.isEmpty()) {
  1522. dbConnect.runSqlUpdate(sqlList);
  1523. }
  1524. if (iserr) {
  1525. ExcelFactory excelFactory = new ExcelFactory("商品明细导入错误信息");
  1526. HashMap<String, String> map = new HashMap<String, String>();
  1527. map.put("itemno", "商品编号");
  1528. map.put("type", "类型");
  1529. map.put("value", "值");
  1530. map.put("msg", "错误信息");
  1531. ArrayList<String> colNameList = new ArrayList<String>();
  1532. HashMap<String, Class> keytypemap = new HashMap<String, Class>();
  1533. colNameList.add("itemno");
  1534. colNameList.add("type");
  1535. colNameList.add("value");
  1536. colNameList.add("msg");
  1537. keytypemap.put("itemno", String.class);
  1538. keytypemap.put("type", String.class);
  1539. keytypemap.put("value", String.class);
  1540. keytypemap.put("msg", String.class);
  1541. rowserr.setFieldList(colNameList);
  1542. rowserr.setFieldTypeMap(keytypemap);
  1543. addSheet(excelFactory, "Sheet1", rowserr, map);
  1544. Rows aa = uploadExcelToObs(excelFactory);
  1545. String url = "";
  1546. if (!aa.isEmpty()) {
  1547. url = aa.get(0).getString("url");
  1548. }
  1549. return getSucReturnObject().setData(url).toString();
  1550. }
  1551. } catch (Exception e1) {
  1552. e1.printStackTrace();
  1553. return getErrReturnObject().setErrMsg(e1.getMessage()).toString();
  1554. }
  1555. return getSucReturnObject().toString();
  1556. }
  1557. public XSSFSheet addSheet(ExcelFactory excelFactory, String sheetname, Rows datarows,
  1558. HashMap<String, String> titlemap) {
  1559. ArrayList<String> keylist = datarows.getFieldList();
  1560. XSSFSheet sheet = excelFactory.getXssfWorkbook().createSheet(sheetname);
  1561. XSSFWorkbook xssfFWorkbook = excelFactory.getXssfWorkbook();
  1562. XSSFCellStyle xssfCellStyle1 = xssfFWorkbook.createCellStyle();
  1563. XSSFFont font = xssfFWorkbook.createFont();
  1564. font.setColor((short) 0xa);
  1565. font.setFontHeightInPoints((short) 12);
  1566. font.setBold(true);
  1567. xssfCellStyle1.setFont(font);
  1568. CellStyle style = xssfFWorkbook.createCellStyle();
  1569. DataFormat format = xssfFWorkbook.createDataFormat();
  1570. style.setDataFormat(format.getFormat("@"));
  1571. // 对单独某一列进行样式赋值,第一个参数为列数,第二个参数为样式
  1572. for (int i = 0; i <= 3; i++) {
  1573. sheet.setDefaultColumnStyle(i, style);
  1574. }
  1575. ExportExcel.setBatchDetailSheetColumn2(sheet);// 设置工作薄列宽
  1576. XSSFCellStyle titleCellStyle1 = ExportExcel.createTitleCellStyle1(xssfFWorkbook);
  1577. XSSFCellStyle titleCellStyle2 = ExportExcel.createTitleCellStyle2(xssfFWorkbook);
  1578. XSSFCellStyle titleCellStyle3 = ExportExcel.createTitleCellStyle3(xssfFWorkbook);
  1579. ExportExcel.batchDetailErr(sheet, titleCellStyle1, titleCellStyle2, titleCellStyle3, xssfFWorkbook);// 写入标题
  1580. for (int n = 0; n < datarows.size(); n++) {
  1581. Row row = datarows.get(n);
  1582. XSSFRow datarow = sheet.createRow(n + 3);
  1583. for (int i1 = 0; i1 < keylist.size(); i1++) {
  1584. Class fieldclazztype = datarows.getFieldMeta(keylist.get(i1)).getFieldtype();
  1585. if (fieldclazztype == Integer.class) {
  1586. datarow.createCell(i1).setCellValue(row.getInteger((String) keylist.get(i1)));
  1587. } else if (fieldclazztype == Long.class) {
  1588. datarow.createCell(i1).setCellValue(row.getLong((String) keylist.get(i1)));
  1589. } else if (fieldclazztype == Float.class) {
  1590. datarow.createCell(i1).setCellValue(row.getFloat((String) keylist.get(i1)));
  1591. } else if (fieldclazztype == Double.class) {
  1592. datarow.createCell(i1).setCellValue(row.getDouble((String) keylist.get(i1)));
  1593. } else {
  1594. datarow.createCell(i1).setCellValue(row.getString((String) keylist.get(i1)));
  1595. }
  1596. if (i1 == 3) {
  1597. datarow.getCell(i1).setCellStyle(xssfCellStyle1);
  1598. }
  1599. }
  1600. }
  1601. return sheet;
  1602. }
  1603. // //查询出项目中的商品添加到合同中去
  1604. // public void addItem(Long sa_contractid, Long sa_projectid) throws YosException {
  1605. //
  1606. // Long sa_quotedpriceid = getSaQuotedPriceId(sa_projectid);
  1607. // Rows rows = dbConnect.runSqlQuery("SELECT itemid,price,qty from sa_quotedprice_items WHERE sa_quotedpriceid =" + sa_quotedpriceid + " AND siteid='" + siteid + "'");
  1608. // ArrayList<String> sqlList = new ArrayList<>();
  1609. // for (Row row : rows) {
  1610. // sqlList.add(addItemSql(sa_contractid, row.getLong("itemid"), row.getBigDecimal("price"), row.getBigDecimal("qty")));
  1611. // }
  1612. // dbConnect.runSqlUpdate(sqlList);
  1613. //
  1614. // }
  1615. //查询项目对应的报价单ID
  1616. public Long getSaProjectId(Long sa_contractid) throws YosException {
  1617. String sql = "SELECT sa_projectid from sa_contract WHERE sa_contractid = " + sa_contractid + " and siteid = '" + siteid + "'";
  1618. Long sa_projectid = -1L;
  1619. Rows rows = dbConnect.runSqlQuery(sql);
  1620. if (rows.isNotEmpty()) {
  1621. sa_projectid = rows.get(0).getLong("sa_projectid");
  1622. }
  1623. return sa_projectid;
  1624. }
  1625. // //查询项目对应的报价单ID
  1626. // public Long getSaQuotedPriceId(Long sa_projectid) throws YosException {
  1627. // String sql = "SELECT sa_quotedpriceid from sa_quotedprice WHERE deleted=0 and CURRENT_TIME>=begdate and CURRENT_TIME<=enddate and status = '审核' and sa_projectid = " + sa_projectid + " and siteid = '" + siteid + "' ORDER BY changedate DESC LIMIT 1";
  1628. // Long sa_quotedpriceid = -1L;
  1629. // Rows rows = dbConnect.runSqlQuery(sql);
  1630. // if (rows.isNotEmpty()) {
  1631. // sa_quotedpriceid = rows.get(0).getLong("sa_quotedpriceid");
  1632. // }
  1633. // return sa_quotedpriceid;
  1634. // }
  1635. public String addItemSql(Long sa_contractid, Long itemid, BigDecimal price, BigDecimal discountrate, BigDecimal qty, BigDecimal marketprice, String type) throws YosException {
  1636. if (price.compareTo(BigDecimal.ZERO) == 0) {
  1637. //当价格为0时,取商品的牌价
  1638. price = ItemPrice.getItemPrice(this, itemid).getMarketprice();
  1639. }
  1640. if (StringUtils.isEmpty(type)) {
  1641. type = "折扣系数";
  1642. }
  1643. Rows rows = dbConnect.runSqlQuery("select sa_contract_itemsid,discountrate,remarks from sa_contract_items where sa_contractid=" + sa_contractid + " and itemid=" + itemid + " and siteid='" + siteid + "'");
  1644. if (rows.isEmpty()) {
  1645. SQLFactory sqlFactory = new SQLFactory(this, "合同商品价格协议表");
  1646. sqlFactory.addParameter("siteid", siteid);
  1647. sqlFactory.addParameter("username", username);
  1648. sqlFactory.addParameter("userid", userid);
  1649. sqlFactory.addParameter("sa_contract_itemsid", createTableID("sa_contract_items"));
  1650. sqlFactory.addParameter("sa_contractid", sa_contractid);
  1651. sqlFactory.addParameter("itemid", itemid);
  1652. sqlFactory.addParameter("price", price);
  1653. sqlFactory.addParameter("type", type);
  1654. sqlFactory.addParameter("discountrate", discountrate);
  1655. sqlFactory.addParameter("qty", qty);
  1656. sqlFactory.addParameter("marketprice", marketprice);
  1657. return sqlFactory.getSQL();
  1658. } else {
  1659. Long sa_contract_itemsid = rows.get(0).getLong("sa_contract_itemsid");
  1660. SQLFactory sqlFactory = new SQLFactory(this, "合同-更新产品");
  1661. sqlFactory.addParameter("siteid", siteid);
  1662. sqlFactory.addParameter("sa_contract_itemsid", sa_contract_itemsid);
  1663. sqlFactory.addParameter("qty", qty);
  1664. sqlFactory.addParameter("price", price);
  1665. sqlFactory.addParameter("type", type);
  1666. sqlFactory.addParameter("discountrate", discountrate);
  1667. sqlFactory.addParameter("model", "");
  1668. sqlFactory.addParameter("remarks", rows.get(0).getString("remarks"));
  1669. sqlFactory.addParameter("marketprice", marketprice);
  1670. return sqlFactory.getSQL();
  1671. }
  1672. }
  1673. //添加条款
  1674. public void addContractClause(Long sa_contractid, String type, String typemx) throws YosException {
  1675. //项目、框架、居间、工具借用
  1676. Long contracttype = 0L;
  1677. switch (type) {
  1678. case "项目":
  1679. if (typemx.equals("直销")) {
  1680. contracttype = 1L;
  1681. } else if (typemx.equals("经销")) {
  1682. contracttype = 2L;
  1683. }
  1684. break;
  1685. case "框架":
  1686. contracttype = 3L;
  1687. break;
  1688. case "居间":
  1689. contracttype = 4L;
  1690. break;
  1691. case "工具借用":
  1692. contracttype = 5L;
  1693. break;
  1694. default:
  1695. contracttype = 0L;
  1696. break;
  1697. }
  1698. Long sa_contract_templateid = new ContractTemplateClause(content).getContractTemplateid(contracttype);
  1699. Rows rows = dbConnect.runSqlQuery("SELECT content,editable from sa_contract_template_clause WHERE sa_contract_templateid = " + sa_contract_templateid + " AND siteid='" + siteid + "'");
  1700. ArrayList<String> sqlList = new ArrayList<>();
  1701. for (Row row : rows) {
  1702. sqlList.add(addContractClauseSql(sa_contractid, createTableID("sa_contract_clause"), row.getString("content"), row.getString("editable")));
  1703. }
  1704. dbConnect.runSqlUpdate(sqlList);
  1705. }
  1706. public String addContractClauseSql(Long sa_contractid, Long sa_contract_clauseid, String content, String editable) throws YosException {
  1707. SQLFactory sqlFactory = new SQLFactory(this, "合同-条款-新增");
  1708. sqlFactory.addParameter("siteid", siteid);
  1709. sqlFactory.addParameter("username", username);
  1710. sqlFactory.addParameter("userid", userid);
  1711. sqlFactory.addParameter("sa_contract_clauseid", sa_contract_clauseid);
  1712. sqlFactory.addParameter("sa_contractid", sa_contractid);
  1713. sqlFactory.addParameter("content", content);
  1714. sqlFactory.addParameter("editable", editable);
  1715. return sqlFactory.getSQL();
  1716. }
  1717. public String updateContractClauseSql(Long sa_contractid, Long sa_contract_clauseid, String content) throws YosException {
  1718. SQLFactory sqlFactory = new SQLFactory(this, "合同-条款-更新");
  1719. sqlFactory.addParameter("siteid", siteid);
  1720. sqlFactory.addParameter("username", username);
  1721. sqlFactory.addParameter("userid", userid);
  1722. sqlFactory.addParameter("sa_contract_clauseid", sa_contract_clauseid);
  1723. sqlFactory.addParameter("sa_contractid", sa_contractid);
  1724. sqlFactory.addParameter("content", content);
  1725. return sqlFactory.getSQL();
  1726. }
  1727. @API(title = "查询合同关联的订单", apiversion = R.ID2025022115343002.v1.class)
  1728. public String queryOrder() throws YosException {
  1729. Long sa_contractid = content.getLong("sa_contractid");
  1730. Rows contractrows = dbConnect.runSqlQuery("SELECT ascription_contractid from sa_contract WHERE ascription_contractid>0 and sa_contractid='" + sa_contractid + "'");
  1731. ArrayList<Long> sa_contractids = contractrows.toArrayList("ascription_contractid", new ArrayList<>());
  1732. sa_contractids.add(sa_contractid);
  1733. QuerySQL a = SQLFactory.createQuerySQL(this, "sa_orderitems", "sa_orderid", "siteid");
  1734. a.addQueryFields("amount", "ifnull(sum(amount), 0)");
  1735. a.addQueryFields("qty", "ifnull(sum(qty), 0)");
  1736. a.addGroupBy("sa_orderid", "siteid");
  1737. QuerySQL querySQL = SQLFactory.createQuerySQL(this, "sa_order",
  1738. "sa_orderid", "sonum", "type", "tradefield", "status", "billdate", "checkdate", "remarks")
  1739. .setTableAlias("t1");
  1740. querySQL.addJoinTable(JOINTYPE.left, "sys_dataextend", "t2", "t2.ownerid = t1.sa_orderid and t2.siteid = t1.siteid and t2.ownertable = 'sa_order'",
  1741. "erpbillno");
  1742. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise", "t3", "t3.sys_enterpriseid=t1.sys_enterpriseid and t3.siteid=t1.siteid",
  1743. "enterprisename");
  1744. querySQL.addJoinTable(JOINTYPE.left, "sa_project", "t4", "t4.sa_projectid=t1.sa_projectid and t4.siteid=t1.siteid",
  1745. "projectname");
  1746. querySQL.addJoinTable(JOINTYPE.left, "sys_hr", "t5", "t5.hrid=t1.saler_hrid and t5.siteid=t1.siteid");
  1747. querySQL.addJoinTable(JOINTYPE.left, "sa_brand", "t6", "t6.sa_brandid=t1.sa_brandid and t6.siteid=t1.siteid",
  1748. "brandname");
  1749. querySQL.addJoinTable(JOINTYPE.left, "sys_enterprise_contacts", "t7", "t7.contactsid=t1.rec_contactsid and t7.siteid=t1.siteid");
  1750. querySQL.addJoinTable(JOINTYPE.left, a, "t8", "t8.sa_orderid=t1.sa_orderid and t8.siteid=t1.siteid",
  1751. "amount", "qty");
  1752. querySQL.addQueryFields("salername", "t5.name");
  1753. querySQL.addQueryFields("contactsname", "t7.name");
  1754. querySQL.addQueryFields("contactsphonenumber", "t7.phonenumber");
  1755. querySQL.addQueryFields("address", "CONCAT(t7.province,t7.city,t7.county,t7.address)");
  1756. querySQL.setSiteid(siteid);
  1757. querySQL.setWhere("t1.deleted=0");
  1758. querySQL.setWhere("t1.sa_contractid ", sa_contractids);
  1759. querySQL.setCondition("t1.sonum", "t3.enterprisename", "t4.projectname", "t5.name");
  1760. querySQL.setPage(pageSize, pageNumber).setOrderBy(pageSorting);
  1761. Rows rows = querySQL.query();
  1762. return getSucReturnObject().setData(rows).toString();
  1763. }
  1764. }