STKServiceImpl.java 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. package com.uas.eis.service.Impl;
  2. import com.fasterxml.jackson.core.type.TypeReference;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.uas.eis.beans.result.Result;
  5. import com.uas.eis.convertor.*;
  6. import com.uas.eis.dao.BaseDao;
  7. import com.uas.eis.dao.SqlRowList;
  8. import com.uas.eis.sdk.dto.*;
  9. import com.uas.eis.sdk.resp.*;
  10. import com.uas.eis.service.RequestSTKService;
  11. import com.uas.eis.service.STKService;
  12. import com.uas.eis.utils.BaseUtil;
  13. import okhttp3.FormBody;
  14. import okhttp3.OkHttpClient;
  15. import okhttp3.Request;
  16. import okhttp3.Response;
  17. import org.apache.commons.collections.CollectionUtils;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.http.HttpEntity;
  22. import org.springframework.http.HttpHeaders;
  23. import org.springframework.http.MediaType;
  24. import org.springframework.http.ResponseEntity;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.util.LinkedMultiValueMap;
  27. import org.springframework.util.MultiValueMap;
  28. import org.springframework.web.client.HttpStatusCodeException;
  29. import org.springframework.web.client.RestTemplate;
  30. import javax.servlet.http.HttpServletRequest;
  31. import java.io.IOException;
  32. import java.math.BigDecimal;
  33. import java.util.ArrayList;
  34. import java.util.HashMap;
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.concurrent.TimeUnit;
  38. import java.util.stream.Collectors;
  39. /**
  40. * @author
  41. * @date 2024-10-12
  42. */
  43. @Service
  44. public class STKServiceImpl implements STKService {
  45. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  46. @Autowired
  47. private BaseDao baseDao;
  48. @Autowired
  49. private RequestSTKService requestSTKService;
  50. private static final ObjectMapper objectMapper = new ObjectMapper();
  51. private final RestTemplate restTemplate = new RestTemplate();
  52. @Override
  53. public Result getJobList(ProductPageDTO productPageDTO) {
  54. int pageNum = 1;
  55. int pageSize = 20;
  56. if (productPageDTO !=null){
  57. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  58. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  59. }else{
  60. return Result.error("参数错误!");
  61. }
  62. int start = ((pageNum - 1) * pageSize + 1);
  63. int end = pageNum * pageSize;
  64. List<JobDTO> jobDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select jo_id,jo_code,jo_name,jo_headmancode,jo_headmanname,jo_orgid,jo_orgcode,jo_orgname,jo_subof,jo_pcode,jo_parentname,jo_level,jo_status,jo_statuscode,isagent from job order by jo_id desc) AA ) where rn>="+start+" and rn<="+end , JobDTO.class);
  65. if (jobDTOS.size() == 0 ){
  66. return Result.error("岗位资料无数据!");
  67. }
  68. int count = baseDao.getCount("select count(1) from job");
  69. List<JobResp> JobResps = JobConvertor.toJobRespListByJobDTOS(jobDTOS);
  70. Map<String,Object> map = new HashMap<>();
  71. map.put("pageNum", pageNum);
  72. map.put("pageSize", pageSize);
  73. map.put("size", count);
  74. map.put("list", JobResps);
  75. return Result.success(map);
  76. }
  77. @Override
  78. public Result getDepartmentList(ProductPageDTO productPageDTO) {
  79. int pageNum = 1;
  80. int pageSize = 20;
  81. if (productPageDTO !=null){
  82. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  83. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  84. }else{
  85. return Result.error("参数错误!");
  86. }
  87. int start = ((pageNum - 1) * pageSize + 1);
  88. int end = pageNum * pageSize;
  89. List<DepartmentDTO> departmentDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select dp_id,dp_code,dp_name,dp_isleaf,dp_status,dp_headmancode,dp_headmanname,dp_pcode,dp_parentdpname,dp_level,dp_subof,dp_statuscode from department order by dp_id desc) AA ) where rn>="+start+" and rn<="+end , DepartmentDTO.class);
  90. if (departmentDTOS.size() == 0 ){
  91. return Result.error("部门资料无数据!");
  92. }
  93. int count = baseDao.getCount("select count(1) from department");
  94. List<DepartmentResp> departmentResps = DepartmentConvertor.toDepartmentRespListByDepartmentDTOS(departmentDTOS);
  95. Map<String,Object> map = new HashMap<>();
  96. map.put("pageNum", pageNum);
  97. map.put("pageSize", pageSize);
  98. map.put("size", count);
  99. map.put("list", departmentResps);
  100. return Result.success(map);
  101. }
  102. @Override
  103. public Result getEmployeeList(ProductPageDTO productPageDTO) {
  104. int pageNum = 1;
  105. int pageSize = 20;
  106. if (productPageDTO !=null){
  107. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  108. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  109. }else{
  110. return Result.error("参数错误!");
  111. }
  112. int start = ((pageNum - 1) * pageSize + 1);
  113. int end = pageNum * pageSize;
  114. List<EmployeeDTO> employeeDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select em_code,em_name,em_sex,em_depart,em_defaultorname,em_position,em_cscode,em_cop,em_class,em_status,em_type,em_mobile,em_id,em_indate,em_recorder,em_departmentcode,em_defaultorcode,em_qywx,em_password from employee where em_class<>'离职' and em_statuscode='AUDITED' order by em_id desc) AA ) where rn>="+start+" and rn<="+end , EmployeeDTO.class);
  115. if (employeeDTOS.size() == 0 ){
  116. return Result.error("员工资料无数据!");
  117. }
  118. int count = baseDao.getCount("select count(1) from employee where em_class<>'离职' and em_statuscode='AUDITED'");
  119. List<EmployeeResp> employeeResps = EmployeeConvertor.toEmployeeRespListByEmployeeDTOS(employeeDTOS);
  120. Map<String,Object> map = new HashMap<>();
  121. map.put("pageNum", pageNum);
  122. map.put("pageSize", pageSize);
  123. map.put("size", count);
  124. map.put("list", employeeResps);
  125. return Result.success(map);
  126. }
  127. @Override
  128. public Result getBusinessChanceList(ProductPageDTO productPageDTO) {
  129. int pageNum = 1;
  130. int pageSize = 20;
  131. if (productPageDTO !=null){
  132. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  133. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  134. }else{
  135. return Result.error("参数错误!");
  136. }
  137. int start = ((pageNum - 1) * pageSize + 1);
  138. int end = pageNum * pageSize;
  139. List<BusinessChanceDTO> businessChanceDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select bc_code,bc_description,bc_lockstatus,bc_khlx_user,bc_nichehouse,bc_currentprocess,bc_status,bc_agency,bt_tel,bc_desc8,bc_doman,bc_lastdate,bc_custcode,bc_custname,bc_position,bc_recorder,bc_recorddate,bc_id,bc_recorderid,bc_statuscode,bc_remark,bc_contact,bc_desc4,bc_tel,bc_desc5,bc_attach,bc_address,bc_desc6,bc_domancode,bc_lockdate,bc_decisionmanphone,bc_designname,bc_domandepart,bc_from from BusinessChance where bc_statuscode in ('AUDITED','FINISH') order by bc_id desc) AA ) where rn>="+start+" and rn<="+end , BusinessChanceDTO.class);
  140. if (businessChanceDTOS.size() == 0 ){
  141. return Result.error("商机资料无数据!");
  142. }
  143. int count = baseDao.getCount("select count(1) from BusinessChance where bc_statuscode in ('AUDITED','FINISH')");
  144. List<BusinessChanceResp> businessChanceResps = BusinessChanceConvertor.toBusinessChanceRespListByBusinessChanceDTOS(businessChanceDTOS);
  145. Map<String,Object> map = new HashMap<>();
  146. map.put("pageNum", pageNum);
  147. map.put("pageSize", pageSize);
  148. map.put("size", count);
  149. map.put("list", businessChanceResps);
  150. return Result.success(map);
  151. }
  152. @Override
  153. public Result getCustomerList(ProductPageDTO productPageDTO) {
  154. int pageNum = 1;
  155. int pageSize = 20;
  156. if (productPageDTO !=null){
  157. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  158. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  159. }else{
  160. return Result.error("参数错误!");
  161. }
  162. int start = ((pageNum - 1) * pageSize + 1);
  163. int end = pageNum * pageSize;
  164. List<CustomerDTO> customerDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select cu_code,cu_name,cu_agency,cu_shortname,cu_auditstatus,cu_status,cu_kind,cu_sellercode,cu_sellername,cu_currency,cu_taxrate,cu_payments,cu_arname,cu_shcustname,cu_add1,cu_recordman,cu_recorddate,cu_cop,cu_remark,cu_id,cu_enablecredit,cu_credit,cu_uu,cu_contact2,cu_tel2 from customer where cu_auditstatuscode in ('AUDITED','DISABLE') order by cu_id desc) AA ) where rn>="+start+" and rn<="+end , CustomerDTO.class);
  165. if (customerDTOS.size() == 0 ){
  166. return Result.error("员工资料无数据!");
  167. }
  168. int count = baseDao.getCount("select count(1) from customer where cu_auditstatuscode in ('AUDITED','DISABLE')");
  169. List<CustomerResp> customerResps = CustomerConvertor.toCustomerRespListByCustomerDTOS(customerDTOS);
  170. Map<String,Object> map = new HashMap<>();
  171. map.put("pageNum", pageNum);
  172. map.put("pageSize", pageSize);
  173. map.put("size", count);
  174. map.put("list", customerResps);
  175. return Result.success(map);
  176. }
  177. @Override
  178. public Result getSaleList(ProductPageDTO productPageDTO) {
  179. int pageNum = 1;
  180. int pageSize = 20;
  181. if (productPageDTO !=null){
  182. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  183. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  184. }else{
  185. return Result.error("参数错误!");
  186. }
  187. int start = ((pageNum - 1) * pageSize + 1);
  188. int end = pageNum * pageSize;
  189. List<SaleDTO> saleDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select sa_code,sa_date,sa_transport,sa_kind,sa_status,sa_custcode,sa_custname,sa_currency,sa_rate,sa_salemethod,sa_apcustcode,sa_apcustname,sa_need4,sa_need10,sa_paymentscode,sa_payments,sa_shcustcode,sa_shcustname,sa_toplace,sa_contact,sa_contacttel,sa_pocode,sa_cop,sa_departmentcode,sa_departmentname,sa_need11,sa_need5,sa_quyu_user,sa_sellercode,sa_seller,sa_need2,sa_need3,sa_need1,sa_chfs,sa_prepayamount,sa_sourcecode,sa_sourcetype,sa_turnstatus,sa_sendstatus,sa_printstatus,sa_count,sa_recorder,sa_recorddate,sa_updateman,sa_updatedate,sa_auditman,sa_auditdate,sa_remark,sa_getprice,sa_custid,sa_statuscode,sa_id,sa_sourceid,sa_recorderid,sa_paymentsid,sa_sync,sa_bcid,sa_minus,sa_b2cpucode,sa_total,sa_ts_user,sa_1_user,sa_sjbh_user" +
  190. ",(select to_char(max(pi_date),'yyyy-mm-dd') pidate_max from prodinout left join prodiodetail on pi_id=pd_piid where pd_ordercode=sa_code and pi_statuscode='POSTED') pidate_max" +
  191. ",sa_yfbl_user||'/'||sa_tsh_user sa_tsh_user, sa_fhbl_user||'/'||sa_zqit_user sa_zqit_user, sa_ysbil_user||'/'||sa_yasntt_user sa_yasntt_user, sa_zbbli_user||'/'||sa_zbtas_user sa_zbtas_user" +
  192. " from Sale where sa_statuscode in ('AUDITED','FINISH') order by sa_id desc) AA ) where rn>="+start+" and rn<="+end , SaleDTO.class);
  193. if (saleDTOS.size() == 0 ){
  194. return Result.error("销售订单无数据!");
  195. }
  196. // 4. 批量查询订单明细
  197. List<SaleDetailDTO> saleDetailDTOS = baseDao.query("select sd_id,sd_said,sd_detno,sd_prodcode,pr_detail,pr_spec,pr_unit,sd_qty,sd_purcprice,sd_price,sd_discount,sd_total,sd_taxrate,sd_remark,sd_costprice,sd_taxtotal,sd_costingprice,sd_isspecial,sd_bonded,sd_delivery,sd_pmcdate,sd_pmcremark,sd_atpdelivery,sd_custprodcode,sd_custproddetail,sd_prodcustcode,pr_vendprodcode,sd_noforecast,sd_forecastcode,sd_forecastdetno,sd_yqty,sd_sendqty,sd_qty-nvl(sd_sendqty,0) sd_leaveassign,sd_leadtime,sd_bgprice,sd_description,sd_remark2,sd_bomid,sd_originaldetno,sd_originalqty,sd_status,sd_barcode,sd_tomakeqty,sd_packagedate,sd_vendorrate,sd_bodycost,sd_minus,sd_bomprice,pr_location from SaleDetail left join Product on sd_prodcode=pr_code where sd_said in (select sa_id from (select rownum rn,AA.* from (select * from Sale where sa_statuscode in ('AUDITED','FINISH') order by sa_id desc) AA) where rn>="+start+" and rn<="+end+") order by sd_said desc,sd_detno" , SaleDetailDTO.class);
  198. // 5. 按订单ID分组订单明细
  199. Map<BigDecimal, List<SaleDetailDTO>> saleDetailMap = saleDetailDTOS.stream().collect(Collectors.groupingBy(SaleDetailDTO::getSd_said));
  200. // 6. 组装数据
  201. List<SaleResp> saleResps = assembleOrderData(saleDTOS, saleDetailMap);
  202. int count = baseDao.getCount("select count(1) from Sale where sa_statuscode in ('AUDITED','FINISH')");
  203. Map<String,Object> map = new HashMap<>();
  204. map.put("pageNum", pageNum);
  205. map.put("pageSize", pageSize);
  206. map.put("size", count);
  207. map.put("list", saleResps);
  208. return Result.success(map);
  209. }
  210. @Override
  211. public Result getRecBalanceNoticeList(ProductPageDTO productPageDTO) {
  212. int pageNum = 1;
  213. int pageSize = 20;
  214. if (productPageDTO !=null){
  215. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  216. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  217. }else{
  218. return Result.error("参数错误!");
  219. }
  220. int start = ((pageNum - 1) * pageSize + 1);
  221. int end = pageNum * pageSize;
  222. List<RecBalanceNoticeDTO> recBalanceNoticeDTOS = baseDao.query("select * from (select rownum rn,AA.* from (select rb_code,rb_kind,rb_date,rb_status,rb_custid,rb_custcode,rb_custname,rb_currency,rb_rate,rb_amount,rb_cmcurrency,rb_cmamount,rb_getdate,rb_counterfee,rb_monthly,rb_yamount,rb_sellercode,rb_sellername,rb_departmentcode,rb_departmentname,rb_zat_user,rb_attention,rb_remark,rb_recorder,rb_recorddate,rb_auditer,rb_auditdate,rb_attach,rb_actamount,rb_cateid,rb_catecode,rb_catename,rb_statuscode,rb_id from RecBalanceNotice where rb_kind='预收款' and rb_statuscode='AUDITED' order by rb_id desc) AA ) where rn>="+start+" and rn<="+end , RecBalanceNoticeDTO.class);
  223. if (recBalanceNoticeDTOS.size() == 0 ){
  224. return Result.error("回款通知(预收)无数据!");
  225. }
  226. // 4. 批量查询回款通知明细
  227. List<RecBalanceNoticeDetailDTO> recBalanceNoticeDetailDTOS = baseDao.query("select rbd_id,rbd_rbid,rbd_detno,rbd_sacode,rbd_date,rbd_currency,rbd_amount,rbd_sellercode,rbd_sellername,rbd_payments,rbd_ordertype,rbd_remark,sa_total,sa_prepayamount,sa_quyu_user from RECBALANCENOTICEDetail LEFT JOIN Sale on rbd_sacode=sa_code where rbd_rbid in (select rb_id from (select rownum rn,AA.* from (select * from RecBalanceNotice where rb_kind='预收款' and rb_statuscode in ('AUDITED') order by rb_id desc) AA) where rn>="+start+" and rn<="+end+") order by rbd_rbid desc,rbd_detno" , RecBalanceNoticeDetailDTO.class);
  228. // 5. 按回款通知ID分组订单明细
  229. Map<BigDecimal, List<RecBalanceNoticeDetailDTO>> recBalanceNoticeDetailMap = recBalanceNoticeDetailDTOS.stream().collect(Collectors.groupingBy(RecBalanceNoticeDetailDTO::getRbd_rbid));
  230. // 6. 组装数据
  231. List<RecBalanceNoticeResp> recBalanceNoticeResps = assembleRecBalanceNoticeData(recBalanceNoticeDTOS, recBalanceNoticeDetailMap);
  232. int count = baseDao.getCount("select count(1) from RecBalanceNotice where rb_kind='预收款' and rb_statuscode in ('AUDITED') ");
  233. Map<String,Object> map = new HashMap<>();
  234. map.put("pageNum", pageNum);
  235. map.put("pageSize", pageSize);
  236. map.put("size", count);
  237. map.put("list", recBalanceNoticeResps);
  238. return Result.success(map);
  239. }
  240. @Override
  241. public Result createVisitRecord(VisitRecordDTO customerVisitDTO) {
  242. if(customerVisitDTO == null) {
  243. return Result.error("参数错误!");
  244. }
  245. if(customerVisitDTO.getType() == null || "".equals(customerVisitDTO.getType())) {
  246. return Result.error("拜访类型不能为空!");
  247. }
  248. String caller_VisitRecord;
  249. if ("客户拜访".equals(customerVisitDTO.getType())){
  250. caller_VisitRecord="OfficeClerk";
  251. }else if ("原厂拜访".equals(customerVisitDTO.getType())){
  252. caller_VisitRecord="VisitRecord!Vender";
  253. }
  254. String nexttime = customerVisitDTO.getNexttime() == null || "".equals(customerVisitDTO.getNexttime()) ? "''" : "to_date('"+customerVisitDTO.getNexttime()+"','yyyy-mm-dd hh24:mi:ss')";
  255. String code = baseDao.sGetMaxNumber("VisitRecord", 2);
  256. int id = baseDao.getSeqId("VisitRecord_SEQ");
  257. List<String> Sql = new ArrayList<>();
  258. Sql.add("insert into VisitRecord(vr_id,vr_code,vr_recorder,vr_recordercode,vr_recorddate,vr_status,vr_statuscode," +
  259. "vr_visittime,vr_visitend,vr_nexttime,vr_visitplace,vr_khsj_user," +
  260. "vr_nichecode,vr_nichename,vr_cuuu,vr_cuname,vr_cucontact,vr_zhwu_user,vr_tel,vr_jtfs_user,vr_title,vr_class,vr_nichestep,vr_detail,vr_attach)" +
  261. "values("+id+",'"+code+"','"+customerVisitDTO.getRecorder()+"','"+customerVisitDTO.getRecordercode()+"',to_date('"+customerVisitDTO.getRecorddate()+"','yyyy-mm-dd hh24:mi:ss'),'在录入','ENTERING'," +
  262. "to_date('"+customerVisitDTO.getVisittime()+"','yyyy-mm-dd hh24:mi:ss'),to_date('"+customerVisitDTO.getVisitend()+"','yyyy-mm-dd hh24:mi:ss'),"+nexttime+"," +
  263. "'"+customerVisitDTO.getVisitplace()+"','"+customerVisitDTO.getKhsj_user()+"'," +
  264. "'"+customerVisitDTO.getNichecode()+"','"+customerVisitDTO.getNichename()+"','"+customerVisitDTO.getCuuu()+"','"+customerVisitDTO.getCuname()+"','"+customerVisitDTO.getCucontact()+"'," +
  265. "'"+customerVisitDTO.getZhwu_user()+"','"+customerVisitDTO.getTel()+"','"+customerVisitDTO.getJtfs_user()+"','"+customerVisitDTO.getTitle()+"','"+customerVisitDTO.getType()+"'," +
  266. "'"+customerVisitDTO.getNichestep()+"','"+customerVisitDTO.getDetail()+"','"+customerVisitDTO.getAttach()+"')");
  267. List<VisitEmpDTO> visitEmp = customerVisitDTO.getVisitEmp();
  268. for (VisitEmpDTO emp : visitEmp){
  269. Sql.add("insert into Players(pl_id,pl_vrid,pl_detno,pl_code,pl_name,pl_sex,pl_position,pl_tel,pl_email,pl_remark)" +
  270. "values(Players_seq.nextval,"+id+","+emp.getDetno()+",'"+emp.getCode()+"','"+emp.getName()+"','"+emp.getSex()+"','"+emp.getPosition()+"','"+emp.getTel()+"','"+emp.getEmail()+"','"+emp.getRemark()+"')");
  271. }
  272. baseDao.execute(Sql);
  273. Map<String,Object> map = new HashMap<>();
  274. map.put("id", id);
  275. map.put("code", code);
  276. String LoginUrl="http://120.132.120.244:8099/ERP/api/pda/login.action";
  277. String URL="http://120.132.120.244:8099/ERP/crm/customermgr/submitVisitRecord.action";
  278. String master="BT";
  279. String caller="WorkDaily";
  280. String empcode = customerVisitDTO.getRecordercode();
  281. Object em_password = baseDao.getFieldDataByCondition("employee", "em_password", "em_code='" + empcode + "'");
  282. String j_username = null;
  283. String j_password = null;
  284. if(em_password != null){
  285. j_username = empcode;
  286. j_password = em_password.toString();
  287. }else{
  288. map.put("message", "员工账号不正确!");
  289. return Result.error(map);
  290. }
  291. try {
  292. String JsonResponse = loginERP(j_username, j_password, master, LoginUrl);
  293. // String resultResponse = submitWorkDaily(id, caller, JsonResponse, URL);
  294. // map.put("id", id);
  295. // map.put("code", resultResponse);
  296. // return Result.success(map);
  297. Map<String, Object> mapResponse = objectMapper.readValue(JsonResponse, new TypeReference<Map<String, Object>>() {});
  298. if(mapResponse != null && mapResponse.get("sessionId")!=null){
  299. String sessionId = mapResponse.get("sessionId").toString();
  300. String cookie = "JSESSIONID="+sessionId;
  301. String resultResponse = submitWorkDaily(id, caller, cookie, URL);
  302. Map<String, Object> resultMapResponse = objectMapper.readValue(resultResponse, new TypeReference<Map<String, Object>>() {});
  303. if(resultMapResponse != null && resultMapResponse.get("success") != null){
  304. String success = resultMapResponse.get("success").toString();
  305. if("true".equals(success)){
  306. map.put("message", "对接成功!");
  307. return Result.success(map);
  308. }else{
  309. return Result.error();
  310. }
  311. }else if (resultMapResponse != null && resultMapResponse.get("exceptionInfo") != null){
  312. map.put("message", resultMapResponse.get("exceptionInfo").toString());
  313. return Result.error(map);
  314. }else{
  315. return Result.error();
  316. }
  317. }else{
  318. if(mapResponse != null && mapResponse.get("success") != null){
  319. if("false".equals(mapResponse.get("success").toString())){
  320. if(mapResponse.get("reason") != null) {
  321. map.put("message", mapResponse.get("reason").toString());
  322. }
  323. return Result.error(map);
  324. }else{
  325. return Result.error();
  326. }
  327. }
  328. return Result.error();
  329. }
  330. } catch (Exception e) {
  331. e.printStackTrace();
  332. map.put("message", "人员登录异常!");
  333. return Result.error(map);
  334. }
  335. }
  336. // 全局OkHttp客户端
  337. private static final OkHttpClient client = new OkHttpClient.Builder()
  338. .connectTimeout(10, TimeUnit.SECONDS)
  339. .readTimeout(10, TimeUnit.SECONDS)
  340. .writeTimeout(10, TimeUnit.SECONDS)
  341. .build();
  342. // public String submitWorkDaily(Integer id, String caller, String cookie ,String URL) {
  343. // // 构造表单参数
  344. // FormBody formBody = new FormBody.Builder()
  345. // .add("id", String.valueOf(id))
  346. // .add("caller", caller)
  347. // .build();
  348. //
  349. // Request request = new Request.Builder()
  350. // .url(URL)
  351. // .header("Cookie",cookie)
  352. // .post(formBody)
  353. // .build();
  354. //
  355. //
  356. //
  357. // try {
  358. // Response response = client.newCall(request).execute();
  359. // if (response.isSuccessful() && response.body() != null) {
  360. // return response.body().string();
  361. // }
  362. // return "请求失败,状态码:" + response.code();
  363. // } catch (HttpStatusCodeException e) {
  364. // // 第三方接口返回500/404/401都会进这里
  365. // logger.error("ERP接口异常,状态码:{},响应体:{}", e.getStatusCode(), e.getResponseBodyAsString(), e);
  366. // return "第三方服务异常:" + e.getResponseBodyAsString();
  367. // } catch (IOException e) {
  368. // logger.error("本地调用发生未知异常", e);
  369. // return "本地代码异常:" + e.getMessage();
  370. // }
  371. // }
  372. public String loginERP(String j_username, String j_password, String master, String URL) throws IOException {
  373. // 构造表单参数
  374. FormBody formBody = new FormBody.Builder()
  375. .add("j_username", j_username)
  376. .add("j_password", j_password)
  377. .add("master", master)
  378. .build();
  379. Request request = new Request.Builder()
  380. .url(URL)
  381. .post(formBody)
  382. .build();
  383. try (Response response = client.newCall(request).execute()) {
  384. if (response.isSuccessful() && response.body() != null) {
  385. return response.body().string();
  386. }
  387. // if (response.isSuccessful() && response.body() != null && response.headers() != null) {
  388. // String setCookies = response.headers().get("Set-Cookie");
  389. // if(setCookies != null && !"".equals(setCookies)){
  390. // return setCookies.substring(0,setCookies.indexOf(";"));
  391. // }else{
  392. // return response.body().string();
  393. // }
  394. // }
  395. return "请求失败,状态码:" + response.code();
  396. }
  397. }
  398. @Override
  399. public Result createWorkDaily(WorkDailyDTO workDailyDTO) {
  400. if(workDailyDTO == null) {
  401. return Result.error("参数错误!");
  402. }
  403. String code = baseDao.sGetMaxNumber("WorkDaily", 2);
  404. int id = baseDao.getSeqId("VisitRecord_SEQ");
  405. List<String> Sql = new ArrayList<>();
  406. Sql.add("insert into WorkDaily(wd_code,wd_entrydate,wd_date,wd_empcode,wd_emp,wd_id,wd_depart,wd_hrorg,wd_joname," +
  407. "wd_status,wd_statuscode,wd_comment,wd_plan,wd_experience,wd_context,wd_empid,wd_attachs,wd_tip)" +
  408. " values('"+code+"',to_date('"+workDailyDTO.getEntrydate()+"','yyyy-mm-dd'),to_date('"+workDailyDTO.getDate()+"','yyyy-mm-dd')," +
  409. "'"+workDailyDTO.getEmpcode()+"','"+workDailyDTO.getEmp()+"',"+id+",'"+workDailyDTO.getDepart()+"',''," +
  410. "'"+workDailyDTO.getJoname()+"','在录入','ENTERING','"+workDailyDTO.getComment()+"','"+workDailyDTO.getPlan()+"','"+workDailyDTO.getExperience()+"'," +
  411. "'"+workDailyDTO.getContext()+"',"+workDailyDTO.getEmpid()+",'"+workDailyDTO.getAttachs()+"','"+workDailyDTO.getTip()+"')");
  412. baseDao.execute(Sql);
  413. Map<String,Object> map = new HashMap<>();
  414. map.put("id", id);
  415. map.put("code", code);
  416. String LoginUrl="http://120.132.120.244:8099/ERP/api/pda/login.action";
  417. String URL="http://120.132.120.244:8099/ERP/oa/persontask/submitWorkDaily.action";
  418. String master="BT";
  419. String caller="WorkDaily";
  420. String empcode = workDailyDTO.getEmpcode();
  421. Object em_password = baseDao.getFieldDataByCondition("employee", "em_password", "em_code='" + empcode + "'");
  422. String j_username = null;
  423. String j_password = null;
  424. if(em_password != null){
  425. j_username = empcode;
  426. j_password = em_password.toString();
  427. }else{
  428. map.put("message", "员工账号不正确!");
  429. return Result.error(map);
  430. }
  431. try {
  432. String JsonResponse = loginERP(j_username, j_password, master, LoginUrl);
  433. // String resultResponse = submitWorkDaily(id, caller, JsonResponse, URL);
  434. // map.put("id", id);
  435. // map.put("code", resultResponse);
  436. // return Result.success(map);
  437. Map<String, Object> mapResponse = objectMapper.readValue(JsonResponse, new TypeReference<Map<String, Object>>() {});
  438. if(mapResponse != null && mapResponse.get("sessionId")!=null){
  439. String sessionId = mapResponse.get("sessionId").toString();
  440. String cookie = "JSESSIONID="+sessionId;
  441. String resultResponse = submitWorkDaily(id, caller, cookie, URL);
  442. Map<String, Object> resultMapResponse = objectMapper.readValue(resultResponse, new TypeReference<Map<String, Object>>() {});
  443. if(resultMapResponse != null && resultMapResponse.get("success") != null){
  444. String success = resultMapResponse.get("success").toString();
  445. if("true".equals(success)){
  446. map.put("message", "对接成功!");
  447. return Result.success(map);
  448. }else{
  449. return Result.error();
  450. }
  451. }else if (resultMapResponse != null && resultMapResponse.get("exceptionInfo") != null){
  452. map.put("message", resultMapResponse.get("exceptionInfo").toString());
  453. return Result.error(map);
  454. }else{
  455. return Result.error();
  456. }
  457. }else{
  458. if(mapResponse != null && mapResponse.get("success") != null){
  459. if("false".equals(mapResponse.get("success").toString())){
  460. if(mapResponse.get("reason") != null) {
  461. map.put("message", mapResponse.get("reason").toString());
  462. }
  463. return Result.error(map);
  464. }else{
  465. return Result.error();
  466. }
  467. }
  468. return Result.error();
  469. }
  470. } catch (Exception e) {
  471. e.printStackTrace();
  472. map.put("message", "人员登录异常!");
  473. return Result.error(map);
  474. }
  475. }
  476. @Override
  477. public Result businessChanceDistribute(List<BusinessChanceDistributeDTO> businessChanceDistributeDTOS) {
  478. if (businessChanceDistributeDTOS.isEmpty()){
  479. return Result.error("参数错误!");
  480. }
  481. List<String> Sql = new ArrayList<>();
  482. for (BusinessChanceDistributeDTO b : businessChanceDistributeDTOS){
  483. if(b.getDoman() == null || "".equals(b.getDoman())){
  484. Sql.add("update BusinessChance set bc_nichehouse='贝腾CRM公海', bc_domancode='', bc_doman='', bc_lastdate=to_date('"+b.getLastdate()+"','yyyy-mm-dd') where bc_id="+b.getId()+" and bc_code ='"+b.getCode()+"'");
  485. }else{
  486. Sql.add("update BusinessChance set bc_domancode='"+b.getDomancode()+"', bc_doman='"+b.getDoman()+"', bc_lastdate=to_date('"+b.getLastdate()+"','yyyy-mm-dd') where bc_id="+b.getId()+" and bc_code ='"+b.getCode()+"'");
  487. }
  488. Sql.add("insert into messagelog(ML_ID,ML_DATE,ML_MAN,ML_CONTENT,ML_RESULT,ML_SEARCH,CODE) "
  489. + "select messageLog_SEQ.nextval,sysdate,'管理员','商机分配','商机分配','BusinessChance|bc_id='||bc_id,bc_code from BusinessChance where bc_id in(" + b.getId() + ")");
  490. }
  491. baseDao.execute(Sql);
  492. return Result.success();
  493. }
  494. /**
  495. * 组装订单主从表数据
  496. */
  497. private List<SaleResp> assembleOrderData(List<SaleDTO> orders, Map<BigDecimal, List<SaleDetailDTO>> itemsMap) {
  498. return orders.stream()
  499. .map(order -> {
  500. SaleResp saleListResp = convertToVO(order);
  501. // 设置订单明细
  502. List<SaleDetailDTO> items = itemsMap.get(order.getSa_id());
  503. if (!CollectionUtils.isEmpty(items)) {
  504. List<SaleDetailResp> itemVOS = items.stream()
  505. .map(this::convertToItemVO)
  506. .collect(Collectors.toList());
  507. saleListResp.setSaleItems(itemVOS);
  508. } else {
  509. saleListResp.setSaleItems(new ArrayList<>());
  510. }
  511. return saleListResp;
  512. })
  513. .collect(Collectors.toList());
  514. }
  515. /**
  516. * 转换订单主表为VO
  517. */
  518. private SaleResp convertToVO(SaleDTO order) {
  519. return SaleConvertor.toSaleResp(order);
  520. }
  521. /**
  522. * 转换订单明细为VO
  523. */
  524. private SaleDetailResp convertToItemVO(SaleDetailDTO item) {
  525. return SaleDetailConvertor.toSaleDetailResp(item);
  526. }
  527. private List<RecBalanceNoticeResp> assembleRecBalanceNoticeData(List<RecBalanceNoticeDTO> orders, Map<BigDecimal, List<RecBalanceNoticeDetailDTO>> itemsMap) {
  528. return orders.stream()
  529. .map(order -> {
  530. RecBalanceNoticeResp recBalanceNoticeListResp = convertToVOByRecBalanceNotice(order);
  531. // 设置订单明细
  532. List<RecBalanceNoticeDetailDTO> items = itemsMap.get(order.getRb_id());
  533. if (!CollectionUtils.isEmpty(items)) {
  534. List<RecBalanceNoticeDetailResp> itemVOS = items.stream()
  535. .map(this::convertToItemVOByRecBalanceNotice)
  536. .collect(Collectors.toList());
  537. recBalanceNoticeListResp.setItems(itemVOS);
  538. } else {
  539. recBalanceNoticeListResp.setItems(new ArrayList<>());
  540. }
  541. return recBalanceNoticeListResp;
  542. })
  543. .collect(Collectors.toList());
  544. }
  545. /**
  546. * 转换订单主表为VO
  547. */
  548. private RecBalanceNoticeResp convertToVOByRecBalanceNotice(RecBalanceNoticeDTO order) {
  549. return RecBalanceNoticeConvertor.toRecBalanceNoticeResp(order);
  550. }
  551. /**
  552. * 转换订单明细为VO
  553. */
  554. private RecBalanceNoticeDetailResp convertToItemVOByRecBalanceNotice(RecBalanceNoticeDetailDTO item) {
  555. return RecBalanceNoticeDetailConvertor.toRecBalanceNoticeDetailResp(item);
  556. }
  557. @Override
  558. public Result getProduct(HttpServletRequest request, ProductReq req) {
  559. String code = req.getCode();
  560. // int pageNum = Integer.valueOf(req.getPageNum());
  561. // int pageSize = Integer.valueOf(req.getPageSize());
  562. // int start = ((pageNum - 1) * pageSize + 1);
  563. // int end = pageNum * pageSize;
  564. List<ProductDTO> productDTOS = baseDao.query("select * from ( SELECT pr_status,pr_serial,pr_code,pr_detail,pr_spec,pr_speccs,pr_remark_warehouse,pr_remark_sale,pr_unit,pr_kind,pr_manutype,pr_dhzc,pr_supplytype,pr_material,pr_level,pr_acceptmethod,pr_whcode,pr_ifbarcodecheck,pr_planner,pr_buyername,pr_cop,pr_recordman,pr_docdate,pr_sourcecode,pr_checkstatus,pr_id,pr_uuid,pr_sendstatus,pr_stockcatecode,pr_smtpoint,pr_safetystock,pr_zxbzs,pr_zxdhl,pr_purcmergedays,pr_stockcatename,pr_tracekind,pr_brand,pr_leadtime " +
  565. " from Product WHERE pr_code in ('"+code+"') order by pr_id desc)" , ProductDTO.class);
  566. if (productDTOS.size() == 0 ){
  567. return Result.error("物料资料不存在");
  568. }
  569. ProdcutResp prodcutResp = ProductConvertor.toProdcutRespByProductDTOs(productDTOS);
  570. return Result.success(prodcutResp);
  571. }
  572. @Override
  573. public Result getBom(BomReq bomReq) {
  574. String bomId = bomReq.getBomId();
  575. List<BomDTO> bomDTOList = baseDao.query("select * from ( SELECT bo_id,bo_version,bo_status,bo_level,bo_mothercode,pr_detail,pr_spec,pr_unit,bo_remark,bo_wcname,bo_ispast,bo_cop,bo_recorder,bo_date,bo_auditman,bo_auditdate,bo_isextend,bo_refbomid,bo_refcode,bo_refname,bo_refspec,bo_style,bo_flowstyle " +
  576. " from Bom LEFT JOIN Product ON bo_mothercode=pr_code WHERE bo_id in ("+bomId+") order by bo_id desc)" , BomDTO.class);
  577. if (bomDTOList.size() == 0 ){
  578. return Result.error("BOM资料不存在");
  579. }
  580. BomResp bomResp = BomConvertor.toBomRespListByBomDTOs(bomDTOList);
  581. BomReadResp bomReadResp = new BomReadResp();
  582. bomReadResp.setMain(bomResp);
  583. List<BomDetailDTO> bomDetailDTOList = baseDao.query("select * from ( SELECT bd_id,bd_bomid,bd_detno,bd_soncode,bd_baseqty,bd_location,bd_remark,bd_ecncode,bd_ifrep,bd_repcode,bd_usestatus " +
  584. " from BomDetail WHERE bd_bomid in ("+bomId+") order by bd_detno)" , BomDetailDTO.class);
  585. if (bomDTOList.size() > 0 ){
  586. List<BomDetailResp> bomDetailResps = BomDetailConvertor.toBomDetailRespListByBomDetailDTOs(bomDetailDTOList);
  587. bomReadResp.setDetail(bomDetailResps);
  588. }
  589. return Result.success(bomReadResp);
  590. }
  591. @Override
  592. public Result getBomList(ProductPageDTO productPageDTO) {
  593. int pageNum = 1;
  594. int pageSize = 20;
  595. if (productPageDTO !=null){
  596. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  597. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  598. }else{
  599. return Result.error("参数错误!");
  600. }
  601. int start = ((pageNum - 1) * pageSize + 1);
  602. int end = pageNum * pageSize;
  603. List<BomDTO> bomDTOList = baseDao.query("select * from (select rownum rn,AA.* from ( SELECT bo_id,bo_version,bo_status,bo_level,bo_mothercode,pr_detail,pr_spec,pr_unit,bo_remark,bo_wcname,bo_ispast,bo_cop,bo_recorder,bo_date,bo_auditman,bo_auditdate,bo_isextend,bo_refbomid,bo_refcode,bo_refname,bo_refspec,bo_style,bo_flowstyle " +
  604. " from Bom LEFT JOIN Product ON bo_mothercode=pr_code order by bo_id desc) AA ) where rn>="+start+" and rn<="+end , BomDTO.class);
  605. if (bomDTOList.size() == 0 ){
  606. return Result.error("BOM资料无数据!");
  607. }
  608. int count = baseDao.getCount("select count(1) from Bom");
  609. Map<String,Object> map = new HashMap<>();
  610. map.put("pageNum", pageNum);
  611. map.put("pageSize", pageSize);
  612. map.put("size", count);
  613. map.put("list", bomDTOList);
  614. return Result.success(map);
  615. }
  616. @Override
  617. public Result getProject(ProductPageDTO productPageDTO) {
  618. int pageNum = 1;
  619. int pageSize = 20;
  620. if (productPageDTO !=null){
  621. pageNum = Integer.valueOf(productPageDTO.getPageNum());
  622. pageSize = Integer.valueOf(productPageDTO.getPageSize());
  623. }else{
  624. return Result.error("参数错误!");
  625. }
  626. int start = ((pageNum - 1) * pageSize + 1);
  627. int end = pageNum * pageSize;
  628. List<ProjectDTO> projectDTOList = baseDao.query("select * from (select rownum rn,AA.* from ( " +
  629. " select prj_id,prj_code,prj_name,prj_sourcecode,prj_customername,prj_sourcetype,prj_customercode,prj_status,prj_producttype,prj_person,prj_assignto,prj_description,prj_start,prj_end,prj_recordate,prj_auditstatus,prj_remark,pt_code from Project left join ProjectMainTask on prj_code=pt_prjcode order by prj_id desc " +
  630. " ) AA ) where rn>="+start+" and rn<="+end , ProjectDTO.class);
  631. if (projectDTOList.size() == 0 ){
  632. return Result.error("项目申请单无数据!");
  633. }
  634. int count = baseDao.getCount("select count(1) from Project");
  635. List<ProjectResp> projectResps = ProjectConvertor.toProjectRespListByProjectDTOs(projectDTOList);
  636. Map<String,Object> map = new HashMap<>();
  637. map.put("pageNum", pageNum);
  638. map.put("pageSize", pageSize);
  639. map.put("size", count);
  640. map.put("list", projectResps);
  641. return Result.success(map);
  642. }
  643. @Override
  644. public Result getBomCost(BomReq bomReq) {
  645. String bomId = bomReq.getBomId();
  646. Object bo_mothercode = null;
  647. if (bomId == null || Integer.valueOf(bomId) == 0){
  648. return Result.error("BOMID不存在!");
  649. }else{
  650. bo_mothercode = baseDao.getFieldDataByCondition("bom", "bo_mothercode", "bo_id=" + bomId);
  651. }
  652. if(bo_mothercode==null){
  653. return Result.error("BOM母件编号不存在!");
  654. }
  655. int count = baseDao.getCount("select count(1) from bomcostMsgLog where trunc(costcountdate_)=trunc(sysdate) and bomid_=" + bomId);
  656. if (count==0) {
  657. baseDao.procedure("SP_COSTCOUNT", new Object[] { bomId, bo_mothercode, "最新采购单价" });
  658. bomPrint(Integer.valueOf(bomId),"BOM!BOMCostDetail!Print");
  659. }
  660. int pageNum = 1;
  661. int pageSize = 20;
  662. if (bomReq !=null){
  663. pageNum = Integer.valueOf(bomReq.getPageNum());
  664. pageSize = Integer.valueOf(bomReq.getPageSize());
  665. }else{
  666. return Result.error("参数错误!");
  667. }
  668. int start = ((pageNum - 1) * pageSize + 1);
  669. int end = pageNum * pageSize;
  670. List<BomCostDTO> bomCostDTOList = baseDao.query("select * from (select rownum rn,AA.* from ( " +
  671. " select BS_LEVEL,BS_SONCODE,Product.PR_DETAIL,Product.PR_SPEC,bd_location,Product.PR_SMTPOINT,BS_BASEQTY,BS_CURRENCY, " +
  672. " BS_RATE,case when BS_CURRENCY='RMB' then round(BS_PURCPRICE,8) else round(BS_PURCPRICE*CR_RATE,8) end BS_PURCPRICE,round(BS_M,8) BS_M,Product.pr_brand," +
  673. " (select pd_price from (select pd_price,pd_prodcode prodcode,row_number() over(partition by pd_prodcode order by pu_auditdate desc) row_number from purchasedetail left join purchase on pd_puid=pu_id where pu_statuscode in ('AUDITED','FINISH')) t where row_number=1 and prodcode=Product.pr_code) price " +
  674. " from BOMStruct " +
  675. " LEFT JOIN Currencys ON BOMStruct.BS_CURRENCY=Currencys.CR_NAME" +
  676. " LEFT JOIN Vendor ON BOMStruct.BS_VENDNAME=Vendor.VE_NAME" +
  677. " LEFT JOIN Product ON BOMStruct.BS_SONCODE=Product.PR_CODE" +
  678. " LEFT JOIN BOM ON BOMStruct.BS_TOPBOMID=BOM.BO_ID" +
  679. " LEFT JOIN Product Product_1 ON BOM.BO_MOTHERCODE=Product_1.PR_CODE" +
  680. " LEFT JOIN BOMDETAIL ON bd_bomid=bo_id AND Product.PR_CODE=BOMDETAIL.bd_soncode" +
  681. " where bo_id="+bomId+
  682. " ORDER BY BOMStruct.BS_IDCODE " +
  683. " ) AA ) ", BomCostDTO.class);
  684. if (bomCostDTOList.size() == 0 ){
  685. return Result.error("BOM成本无数据!");
  686. }
  687. Map<String,Object> map = new HashMap<>();
  688. map.put("pageNum", pageNum);
  689. map.put("pageSize", pageSize);
  690. map.put("size", bomCostDTOList.size());
  691. map.put("list", bomCostDTOList);
  692. return Result.success(map);
  693. }
  694. @Override
  695. public Result insertOrUpdateAppraise(AppraiseReq appraiseReq) {
  696. String code = appraiseReq.getCode();
  697. String recorder = appraiseReq.getRecorder();
  698. if(code==null){
  699. return Result.error("估价申请编号参数错误!");
  700. }
  701. List<String> sqls = new ArrayList<String>();
  702. List<AppraiseDetailDTO> items = appraiseReq.getItems();
  703. int count = baseDao.getCount("select count(1) from CUSTOMTABLE where ct_caller='STW-0005' and ct_code='" + code + "'");
  704. if (count>0) {
  705. count = baseDao.getCount("select count(1) from CUSTOMTABLE where ct_statuscode='ENTERING' and ct_caller='STW-0005' and ct_code='" + code + "'");
  706. //修改
  707. if (count>0) {
  708. Object ctid = baseDao.getFieldDataByCondition("CUSTOMTABLE", "ct_id", "ct_statuscode='ENTERING' and ct_caller='STW-0005' and ct_code='" + code + "'");
  709. Object cd_detno_max = baseDao.getFieldDataByCondition("CUSTOMTABLEDETAIL", "max(cd_detno)", "cd_ctid=" + ctid);
  710. int detno = 1;
  711. for(AppraiseDetailDTO detailDTO : items){
  712. if(detailDTO.getCd_id()>0){
  713. String DetailSql ="update CUSTOMTABLEDETAIL set cd_varchar50_2='"+detailDTO.getCd_number_2()+"',cd_varchar50_3='"+detailDTO.getCd_varchar50_3()+"',cd_varchar50_1='"+detailDTO.getCd_varchar50_1()+
  714. "',cd_number_1="+detailDTO.getCd_number_1()+",cd_number_2="+detailDTO.getCd_number_2()+",cd_number_3="+detailDTO.getCd_number_3()+",cd_number_4="+detailDTO.getCd_number_4()+
  715. " where cd_id="+detailDTO.getCd_id()+" and exists (select 1 from CUSTOMTABLE where ct_id=cd_ctid and ct_statuscode='ENTERING' and ct_caller='STW-0005' and ct_code='"+code+"')";
  716. sqls.add(DetailSql);
  717. }else{
  718. //新增
  719. if (cd_detno_max !=null && detno == 1){
  720. detno = Integer.valueOf(cd_detno_max.toString()) + 1 ;
  721. }
  722. String DetailSql = "insert into CUSTOMTABLEDETAIL(cd_id,cd_ctid,cd_detno,cd_varchar50_2,cd_varchar50_3,cd_varchar50_1,cd_number_1,cd_number_2,cd_number_3,cd_number_4)" +
  723. " values(CUSTOMTABLEDETAIL_seq.nextval,"+ctid+","+detno+",'"+detailDTO.getCd_varchar50_2()+"','"+detailDTO.getCd_varchar50_3()+"','"+detailDTO.getCd_varchar50_1()+
  724. "',"+detailDTO.getCd_number_1()+","+detailDTO.getCd_number_2()+","+detailDTO.getCd_number_3()+","+detailDTO.getCd_number_4()+")";
  725. sqls.add(DetailSql);
  726. detno++;
  727. }
  728. }
  729. }
  730. }else{
  731. //新增
  732. int ct_id = baseDao.getSeqId("CUSTOMTABLE_SEQ");
  733. int detno = 1;
  734. String FormSql= "insert into CUSTOMTABLE(CT_ID,CT_CALLER,CT_STATUSCODE,CT_STATUS,CT_CODE,ct_recorder,ct_sourcekind,ct_recorddate)" +
  735. " values("+ct_id+",'STW-0005','ENTERING','在录入','"+code+"','"+recorder+"','估价申请',sysdate)";
  736. sqls.add(FormSql);
  737. for(AppraiseDetailDTO detailDTO : items){
  738. String DetailSql = "insert into CUSTOMTABLEDETAIL(cd_id,cd_ctid,cd_detno,cd_varchar50_2,cd_varchar50_3,cd_varchar50_1,cd_number_1,cd_number_2,cd_number_3,cd_number_4)" +
  739. " values(CUSTOMTABLEDETAIL_seq.nextval,"+ct_id+","+detno+",'"+detailDTO.getCd_varchar50_2()+"','"+detailDTO.getCd_varchar50_3()+"','"+detailDTO.getCd_varchar50_1()+
  740. "',"+detailDTO.getCd_number_1()+","+detailDTO.getCd_number_2()+","+detailDTO.getCd_number_3()+","+detailDTO.getCd_number_4()+")";
  741. sqls.add(DetailSql);
  742. detno++;
  743. }
  744. }
  745. baseDao.execute(sqls);
  746. return Result.success();
  747. }
  748. @Override
  749. public Result getBomAndSon(BomReq bomReq) {
  750. String bomId = bomReq.getBomId();
  751. Object bo_mothercode = null;
  752. if (bomId == null || Integer.valueOf(bomId) == 0){
  753. return Result.error("BOMID不存在!");
  754. }else{
  755. bo_mothercode = baseDao.getFieldDataByCondition("bom", "bo_mothercode", "bo_id=" + bomId);
  756. }
  757. if(bo_mothercode==null){
  758. return Result.error("BOM母件编号不存在!");
  759. }
  760. if (bomId != null && !bomId.equals("") && bomId.matches("\\d*") && bo_mothercode != null && !bo_mothercode.equals("")) {
  761. SqlRowList rs = baseDao
  762. .queryForRowSet("select bo_id,pr_specdescription from product left join bom on (pr_code=bo_mothercode or pr_refno=bo_mothercode) where"
  763. + " pr_code='" + bo_mothercode + "' and bo_id=" + bomId);
  764. if (rs.next()) {
  765. String res = baseDao.callProcedure("MM_SetProdBomStruct",
  766. new Object[] { rs.getInt("bo_id"), rs.getString("pr_specdescription") });
  767. if (res != null && res.length() > 0) {
  768. BaseUtil.showError(res);
  769. }
  770. } else {
  771. return Result.error("BOM母件编号不存在!");
  772. }
  773. }
  774. List<BomStructDTO> bomStructDTOList = baseDao.query("select * from (select bs_idcode,bs_level,bs_bomid,bs_sonbomid,bs_mothercode,bs_bddetno,bs_soncode,pr_detail,pr_spec,pr_speccs,pr_unit,bs_baseqty,bs_location,bs_usestatus,bs_ecncode,bs_remark,bs_ifrep,ifrep,pr_lossrate,pr_leadtime,pr_zxdhl,po_onhand-nvl(po_defectonhand,0) po_onhand,PR_STANDARDIZED,pr_material,pr_sqrq,bo_level,bo_wccode,bo_ispast " +
  775. " from MA_BOMSTRUCT_VIEW where bs_topbomid="+bomId+" AND (bs_topmothercode='"+bo_mothercode+"') " +
  776. " order by bs_topbomid,bs_idcode,ifrep desc,bs_soncode )" , BomStructDTO.class);
  777. if (bomStructDTOList.size() > 0 ){
  778. return Result.success(bomStructDTOList);
  779. }else{
  780. return Result.error("BOM母件编号不存在!");
  781. }
  782. }
  783. /**
  784. * bom成本计算 打印前执行方法
  785. * @param id
  786. */
  787. public void bomPrint(Integer id,String caller){
  788. String SQLStr = null, thisMonthercode = null;
  789. Object ob = baseDao.getFieldDataByCondition("bom", "bo_mothercode", "bo_id="+id);
  790. if(ob != null){
  791. thisMonthercode = ob.toString();
  792. }
  793. // 取出当月汇率
  794. double ThisUSDRate =Double.parseDouble(baseDao.getFieldDataByCondition("Currencys","nvl(max(cr_rate),0)"," cr_name='USD' and nvl(cr_status,' ')<>'已禁用'").toString());
  795. double ThisHKDRate =Double.parseDouble(baseDao.getFieldDataByCondition("Currencys","nvl(max(cr_rate),0)"," cr_name='HKD' and nvl(cr_status,' ')<>'已禁用'").toString());
  796. /*if (ThisUSDRate == 0) {
  797. BaseUtil.showError("币别表未设置美金汇率!");
  798. } xzx 2017090191号问题反馈*/
  799. SQLStr = "update BomStruct set bs_osprice=0 where bs_topbomid=" + id + " and bs_osprice is null ";
  800. baseDao.execute(SQLStr);
  801. SQLStr = "merge into BomStruct using (select cr_rate,cr_name from currencys where nvl(cr_status,' ')<>'已禁用') src on( bs_currency=cr_name) when matched then update set bs_l=(CASE WHEN bs_currency='RMB' then bs_purcprice/(1+bs_rate/100) ELSE bs_purcprice*cr_rate END) where bs_topbomid="
  802. + id + " and bs_topmothercode='"+thisMonthercode+"' and (nvl(bs_sonbomid,0)=0 or nvl(bs_sonbomid,0) in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 )) ";
  803. baseDao.execute(SQLStr);
  804. SQLStr = "update BomStruct set bs_m=bs_l*bs_baseqty where bs_topbomid=" + id + " and bs_topmothercode='"+thisMonthercode+"' and (nvl(bs_sonbomid,0)=0 or nvl(bs_sonbomid,0) in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 ))";
  805. baseDao.execute(SQLStr);
  806. SQLStr = "merge into BomStruct using(select cr_rate,cr_name from currencys where nvl(cr_status,' ')<>'已禁用') src on(bs_currency=cr_name)when matched then update set bs_j=(CASE WHEN bs_currency='RMB' then bs_purcprice ELSE bs_purcprice*cr_rate END) where bs_topbomid="
  807. + id + " and bs_topmothercode='"+thisMonthercode+"' and (nvl(bs_sonbomid,0)=0 or nvl(bs_sonbomid,0) in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 )) ";
  808. baseDao.execute(SQLStr);
  809. SQLStr = "update BomStruct set bs_k=bs_j*bs_baseqty where bs_topbomid=" + id + " and (nvl(bs_sonbomid,0)=0 or nvl(bs_sonbomid,0) in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 )) ";
  810. baseDao.execute(SQLStr);
  811. SQLStr = "update BomStruct set bs_n=CASE WHEN bs_currency='RMB' then bs_l ELSE bs_purcprice END where bs_topbomid=" + id + " and bs_topmothercode='"+thisMonthercode+"' and (nvl(bs_sonbomid,0)=0 or nvl(bs_sonbomid,0) in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 )) ";
  812. baseDao.execute(SQLStr);
  813. SQLStr = "update BomStruct set bs_o=bs_n*bs_baseqty where bs_topbomid=" + id + " and bs_topmothercode='"+thisMonthercode+"' and (nvl(bs_sonbomid,0)=0 or nvl(bs_sonbomid,0) in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 )) ";
  814. baseDao.execute(SQLStr);
  815. SQLStr = "update BomStruct set bs_remark='' where bs_topbomid=" + id+" and bs_topmothercode='"+thisMonthercode+"' ";
  816. baseDao.execute(SQLStr);
  817. SQLStr = "update BomStruct set bs_usdrate=" + ThisUSDRate + ",bs_hkdrate=" + ThisHKDRate
  818. + " where bs_topbomid=" + id+" and bs_topmothercode='"+thisMonthercode+"' ";
  819. baseDao.execute(SQLStr);
  820. SQLStr = "update BomStruct set bs_remark='father' where bs_topbomid=" + id + " and bs_topmothercode='"+thisMonthercode+"' and nvl(bs_sonbomid,0)>0 ";
  821. baseDao.execute(SQLStr);
  822. SQLStr = "update BomStruct set bs_remark='father' where bs_topbomid=" + id + " and bs_soncode='" + thisMonthercode + "' ";
  823. baseDao.execute(SQLStr);
  824. SQLStr = "update BomStruct set bs_currency='RMB',bs_purcprice=bs_osprice,bs_purcpricermb=0,bs_totalpurcpricermb=0,bs_totalpurcpriceusd=0 where bs_topbomid="
  825. + id + " and bs_topmothercode='"+thisMonthercode+"' and (nvl(bs_sonbomid,0)>0 or bs_soncode='" + thisMonthercode + "') and nvl(bs_sonbomid,0) not in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 ) ";
  826. baseDao.execute(SQLStr);
  827. SQLStr = "select bs_idcode,bs_soncode from BomStruct where bs_topbomid=" + id
  828. + " and bs_topmothercode='"+thisMonthercode+"' and nvl(bs_sonbomid,0)>0 and nvl(bs_sonbomid,0) not in (select bo_id from bom left join bomlevel on bl_code=bo_level where nvl(bo_level,' ')='外购件BOM' or nvl(bl_ifpurchase,0)<>0 ) ORDER BY bs_level";
  829. SqlRowList rs = baseDao.queryForRowSet(SQLStr);
  830. while (rs.next()) {//bs_osprice 在存储过程中计算出来的值是含税的委外单价
  831. SQLStr = "SELECT sum(nvl(bs_m,0)),sum(nvl(bs_k,0)),sum(bs_o) from BomStruct WHERE bs_topbomid=" + id
  832. + " and bs_topmothercode='"+thisMonthercode+"' and bs_mothercode='" + rs.getString("bs_soncode") + "' ";
  833. SqlRowList rsthis = baseDao.queryForRowSet(SQLStr);
  834. if (rsthis.next()) {
  835. SQLStr = "update bomstruct set bs_m=round((" + rsthis.getString(1) + "+nvl(bs_osprice,0)/(1+nvl(bs_rate,0)/100)),8)*bs_baseqty,bs_k=round((" + rsthis.getString(2) + "+nvl(bs_osprice,0)),8)*bs_baseqty,bs_o="
  836. + rsthis.getString(3) + " where bs_topbomid="+id+" and bs_idcode=" + rs.getString("bs_idcode");
  837. baseDao.execute(SQLStr);
  838. }
  839. }
  840. // 当前计算的主件自身
  841. SQLStr = "SELECT bs_topmothercode from BomStruct WHERE bs_topbomid=" + id
  842. + " and bs_topmothercode='"+thisMonthercode+"' and bs_mothercode='" + thisMonthercode + "' ";
  843. SqlRowList rss = baseDao.queryForRowSet(SQLStr);
  844. if (rss.next()) {//bs_m 不含税成本 ,bs_k 含税成本
  845. Object a = baseDao.getFieldDataByCondition("BomStruct", "round(sum(nvl(bs_m,0)),8)", " bs_topbomid=" + id
  846. + " and bs_mothercode='" + thisMonthercode + "'");
  847. Object b = baseDao.getFieldDataByCondition("BomStruct", "round(sum(nvl(bs_k,0)),8)", " bs_topbomid=" + id
  848. + " and bs_mothercode='" + thisMonthercode + "'");
  849. Object c = baseDao.getFieldDataByCondition("BomStruct", "round(sum(nvl(bs_o,0)),8)", " bs_topbomid=" + id
  850. + " and bs_mothercode='" + thisMonthercode + "'");
  851. SQLStr = "update bomstruct set bs_m=round((?+nvl(bs_osprice,0)/(1+nvl(bs_rate,0)/100)),8)*bs_baseqty,bs_k=round((?+nvl(bs_osprice,0)),8)*bs_baseqty,bs_o=? where bs_topbomid="+id+" and bs_soncode='"
  852. + thisMonthercode + "' ";
  853. baseDao.execute(SQLStr,new Object[]{a,b,c});
  854. }
  855. SQLStr = "update BomStruct set bs_m=0 where bs_topbomid=" + id + " and bs_m is null ";
  856. baseDao.execute(SQLStr);
  857. //调用存储过程每个客户特殊的代码更新
  858. baseDao.procedure("SP_COSTCOUNT_AFTER_MSG", new Object[] { id});
  859. }
  860. public String submitWorkDaily(Integer id, String caller,String cookie , String URL) {
  861. logger.info("请求ERP接口,id={},caller={}", id, caller);
  862. MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
  863. paramMap.add("id", String.valueOf(id));
  864. paramMap.add("caller", caller);
  865. HttpHeaders headers = new HttpHeaders();
  866. headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
  867. headers.add("Cookie", cookie);
  868. HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(paramMap, headers);
  869. try {
  870. ResponseEntity<String> res = restTemplate.postForEntity(URL, request, String.class);
  871. logger.info("ERP正常返回,code:{},body:{}", res.getStatusCode(), res.getBody());
  872. return res.getBody();
  873. } catch (HttpStatusCodeException e) {
  874. // 第三方接口返回500/404/401都会进这里
  875. logger.error("ERP接口异常,状态码:{},响应体:{}", e.getStatusCode(), e.getResponseBodyAsString(), e);
  876. return e.getResponseBodyAsString();
  877. } catch (Exception e) {
  878. logger.error("本地调用发生未知异常", e);
  879. return "本地代码异常:" + e.getMessage();
  880. }
  881. }
  882. }