OrderReceivablesServiceImpl.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. package com.goafanti.order.service.impl;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.io.UnsupportedEncodingException;
  6. import java.math.BigDecimal;
  7. import java.text.ParseException;
  8. import java.text.SimpleDateFormat;
  9. import java.util.ArrayList;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.UUID;
  15. import javax.annotation.Resource;
  16. import javax.servlet.http.HttpServletResponse;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  19. import org.apache.poi.ss.formula.functions.T;
  20. import org.apache.poi.ss.usermodel.Cell;
  21. import org.apache.poi.ss.usermodel.Row;
  22. import org.apache.poi.ss.usermodel.Sheet;
  23. import org.apache.poi.ss.usermodel.Workbook;
  24. import org.apache.poi.ss.util.CellRangeAddress;
  25. import org.apache.poi.xssf.usermodel.XSSFCell;
  26. import org.apache.poi.xssf.usermodel.XSSFCellStyle;
  27. import org.apache.poi.xssf.usermodel.XSSFRow;
  28. import org.apache.poi.xssf.usermodel.XSSFSheet;
  29. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.web.multipart.MultipartFile;
  33. import com.goafanti.common.bo.Error;
  34. import com.goafanti.common.constant.AFTConstants;
  35. import com.goafanti.common.dao.TOrderBillNewMapper;
  36. import com.goafanti.common.dao.TOrderBonusMapper;
  37. import com.goafanti.common.dao.TOrderLogMapper;
  38. import com.goafanti.common.dao.TOrderNewMapper;
  39. import com.goafanti.common.dao.TOrderTaskMapper;
  40. import com.goafanti.common.dao.TemporaryReceivablesMapper;
  41. import com.goafanti.common.enums.OrderLogProcess;
  42. import com.goafanti.common.error.BusinessException;
  43. import com.goafanti.common.model.TOrderBillNew;
  44. import com.goafanti.common.model.TOrderBonus;
  45. import com.goafanti.common.model.TOrderLog;
  46. import com.goafanti.common.model.TOrderNew;
  47. import com.goafanti.common.model.TOrderTask;
  48. import com.goafanti.common.model.TemporaryReceivables;
  49. import com.goafanti.common.utils.DateUtils;
  50. import com.goafanti.common.utils.ExportExcelUtil;
  51. import com.goafanti.common.utils.LoggerUtils;
  52. import com.goafanti.core.mybatis.BaseMybatisDao;
  53. import com.goafanti.core.mybatis.page.Pagination;
  54. import com.goafanti.core.shiro.token.TokenManager;
  55. import com.goafanti.order.bo.OrderListBo;
  56. import com.goafanti.order.bo.OrderReportBo;
  57. import com.goafanti.order.bo.ReceivablesListBo;
  58. import com.goafanti.order.bo.TOrderBonusBo;
  59. import com.goafanti.order.bo.TOrderInvoiceBo;
  60. import com.goafanti.order.bo.TemporaryReceivablesBo;
  61. import com.goafanti.order.enums.ApprovalNewState;
  62. import com.goafanti.order.enums.BonusSubject;
  63. import com.goafanti.order.enums.LiquidationNewState;
  64. import com.goafanti.order.enums.OrderNewState;
  65. import com.goafanti.order.enums.ProcessStatus;
  66. import com.goafanti.order.enums.ProjectNewStage;
  67. import com.goafanti.order.enums.TransactionSubject;
  68. import com.goafanti.order.service.FundManageOrderService;
  69. import com.goafanti.order.service.OrderBillService;
  70. import com.goafanti.order.service.OrderInvoiceService;
  71. import com.goafanti.order.service.OrderReceivablesService;
  72. @Service
  73. public class OrderReceivablesServiceImpl extends BaseMybatisDao<TemporaryReceivablesMapper> implements OrderReceivablesService{
  74. @Autowired
  75. private TemporaryReceivablesMapper temporaryReceivablesMapper;
  76. @Autowired
  77. private TOrderBillNewMapper tOrderBillNewMapper;
  78. @Autowired
  79. private TOrderNewMapper tOrderNewMapper;
  80. @Autowired
  81. private TOrderBonusMapper tOrderBonusMapper;
  82. @Autowired
  83. private TOrderLogMapper tOrderLogMapper;
  84. @Autowired
  85. private TOrderTaskMapper tOrderTaskMapper;
  86. @Resource
  87. private FundManageOrderService fundManageOrderService;
  88. @Resource
  89. private OrderInvoiceService orderInvoiceService;
  90. @Resource
  91. private OrderBillService orderBillService;
  92. @Override
  93. public int addReceivables(TemporaryReceivablesBo t) {
  94. t.setAid(TokenManager.getAdminId());
  95. if(t.getCorporateName()==null)t.setCorporateName("");
  96. t.setCreateTime(new Date());
  97. t.setStatus(0);
  98. if(t.getReceivablesTimes()!=null) {
  99. try {
  100. t.setReceivablesTime(DateUtils.StringToDate(t.getReceivablesTimes(), AFTConstants.YYYYMMDD));
  101. } catch (ParseException e) {
  102. throw new BusinessException("时间转换错误");
  103. }
  104. }
  105. return temporaryReceivablesMapper.insertSelective(t);
  106. }
  107. @Override
  108. public int updateReceivables(TemporaryReceivablesBo t) {
  109. if(t.getReceivablesTimes()!=null) {
  110. try {
  111. t.setReceivablesTime(DateUtils.StringToDate(t.getReceivablesTimes(), AFTConstants.YYYYMMDD));
  112. } catch (ParseException e) {
  113. throw new BusinessException("时间转换错误");
  114. }
  115. }
  116. return temporaryReceivablesMapper.updateByPrimaryKeySelective(t);
  117. }
  118. @Override
  119. public int deleteReceivables(String ids) {
  120. List<String> delList = new ArrayList<String>();
  121. String[] strs = ids.split(",");
  122. for (String str : strs) {
  123. delList.add(str);
  124. }
  125. return temporaryReceivablesMapper.deleteByids(delList);
  126. }
  127. @Override
  128. public int deleteAllReceivables() {
  129. return temporaryReceivablesMapper.deleteByaid(TokenManager.getAdminId());
  130. }
  131. @Override
  132. public int batchImport() {
  133. List<TemporaryReceivables> list=temporaryReceivablesMapper.selectByaid(TokenManager.getAdminId());
  134. if(list.size()>99)throw new BusinessException(new Error("数量过大,建议不超过99。"));
  135. List<TOrderBillNew> listBull=new ArrayList<>();
  136. for (TemporaryReceivables tr : list) {
  137. TOrderBillNew tbn=new TOrderBillNew();
  138. //获取已收款
  139. BigDecimal bill = tOrderBillNewMapper.getAmountByOid(tr.getOrderNo());
  140. //获取总金额
  141. TOrderNew t=tOrderNewMapper.selectByPrimaryKey(tr.getOrderNo());
  142. //如果订单不是自己的则也不允许收款
  143. if(t==null||t.getOrderNo()==null||!t.getFinanceId().equals(TokenManager.getAdminId())) {
  144. tr.setStatus(2);
  145. temporaryReceivablesMapper.updateByPrimaryKeySelective(tr);
  146. continue;
  147. }
  148. //计算收款结果
  149. BigDecimal bd = bill.add(tr.getAmount().abs());
  150. //判断表中数据
  151. BigDecimal count = new BigDecimal(0).add(bd);
  152. for (TOrderBillNew tBill : listBull) {
  153. if (tBill.getOrderNo().equals(tr.getOrderNo())) {
  154. count=count.add(tBill.getTransactionAmount());
  155. continue;
  156. }
  157. }
  158. TOrderBonus bonus = new TOrderBonus();
  159. bonus.setId(UUID.randomUUID().toString());
  160. bonus.setOrderNo(tr.getOrderNo());
  161. bonus.setGrantBy(TokenManager.getAdminId());
  162. int lstaus = 0;//如果订单流水小于首付 lstaus 0
  163. if(count.compareTo(t.getTotalAmount()) == 1){//如果订单流水总额大于总金额 return -1
  164. tr.setStatus(2);
  165. temporaryReceivablesMapper.updateByPrimaryKeySelective(tr);
  166. continue;
  167. }else if (count.compareTo(t.getTotalAmount()) == 0) {//等于总额
  168. //付完款//如果订单流水等于于总金额 lstaus 2
  169. lstaus = 2;
  170. bonus.setBonusSubject(BonusSubject.WK.getCode());//12
  171. //发放给技术员如果付完款所有参与这个项目任务的人都会有结算奖
  172. //获得所有的任务负责人
  173. List<TOrderTask> l = tOrderTaskMapper.getReceiverByOid(tr.getOrderNo());
  174. for (TOrderTask tOrderTask : l) {
  175. if(null != tOrderTask &&null != tOrderTask.getTaskReceiver()){
  176. bonus.setTaskId(tOrderTask.getId());//任务id
  177. bonus.setGrantTarget(tOrderTask.getTaskReceiver());
  178. bonus.setGrantType(1);
  179. int c = tOrderBonusMapper.checkByOnoAndSub(bonus);
  180. //不存在就设置
  181. if(c==0){
  182. bonus.setId(UUID.randomUUID().toString());
  183. tOrderBonusMapper.insertSelective(bonus);
  184. }
  185. }
  186. }
  187. if(tr.getStatus()==2) {
  188. tr.setStatus(0);
  189. temporaryReceivablesMapper.updateByPrimaryKeySelective(tr);
  190. }
  191. addOrderLog(tr.getOrderNo(), OrderLogProcess.CWQK.getCode());
  192. }else if (count.compareTo(t.getTotalAmount()) == -1) {//小于总额
  193. //如果订单流水小于总金额
  194. if(bd.compareTo(t.getFirstAmount()) == 0 || bd.compareTo(t.getFirstAmount()) == 1){//首付完成
  195. //查看首付奖是否存在
  196. TOrderBonus b = new TOrderBonus();
  197. b.setOrderNo(tr.getOrderNo());
  198. b.setBonusSubject(11);
  199. b.setGrantType(0);
  200. b.setGrantTarget(t.getSalesmanId());
  201. int c = tOrderBonusMapper.checkByOnoAndSub(b);
  202. //不存在就设置
  203. if(c==0){
  204. bonus.setBonusSubject(BonusSubject.SF.getCode());//11
  205. }
  206. lstaus = 1;
  207. if(tr.getStatus()==2) {
  208. tr.setStatus(0);
  209. temporaryReceivablesMapper.updateByPrimaryKeySelective(tr);
  210. }
  211. addOrderLog(tr.getOrderNo(), OrderLogProcess.CWSF.getCode());
  212. }
  213. }
  214. //否则新增流水信息
  215. tbn.setBillNo(UUID.randomUUID().toString().replaceAll("-", ""));
  216. tbn.setCreater(TokenManager.getAdminId());
  217. tbn.setType(1);//批量
  218. tbn.setOrderNo(t.getOrderNo());
  219. tbn.setCreateTime(new Date());
  220. tbn.setPayeeId("0");//默认设置0
  221. tbn.setPayerId(t.getBuyerId());
  222. tbn.setTransactionSubject(0);
  223. tbn.setTransactionChannel(2);
  224. tbn.setConfirmSign(0);
  225. tbn.setTransactionAmount(tr.getAmount());
  226. tbn.setDeleteSign((new Byte("0")));
  227. tbn.setFinancialPayTime(tr.getReceivablesTime());
  228. tbn.setFinancialPayNo(tr.getFinancialPayNo());
  229. tbn.setRemarks(tr.getRemarks());
  230. //修改订单结算金额和结算状态
  231. //如果已经首付并且流程状态是没有派给咨询师的修改流程状态为4
  232. TOrderNew orderNew = new TOrderNew();
  233. orderNew.setOrderNo(tr.getOrderNo());
  234. //这里的已收金额是以前收的所有金额加上本次收的金额
  235. orderNew.setSettlementAmount(count);
  236. orderNew.setLiquidationStatus(lstaus);
  237. if((lstaus == LiquidationNewState.WAIT_PAY_LAST_BALANCE.getCode()
  238. || lstaus == LiquidationNewState.ALREADY_PAY.getCode())
  239. && t.getProcessStatus() < ProcessStatus.YPZXSGLY.getCode()){
  240. //流程状态是3,结算是付款的话
  241. orderNew.setProcessStatus(ProcessStatus.YPZXSGLY.getCode());//4
  242. }
  243. tOrderNewMapper.updateByPrimaryKeySelective(orderNew);
  244. //如果达到奖金发放要求新增奖金信息
  245. if(null != bonus.getBonusSubject()){
  246. bonus.setId(UUID.randomUUID().toString());
  247. bonus.setGrantTarget(t.getSalesmanId());
  248. //设置发放人类型
  249. bonus.setGrantType(0);
  250. tOrderBonusMapper.insertSelective(bonus);
  251. }
  252. listBull.add(tbn);
  253. }
  254. if(!listBull.isEmpty()) {
  255. tOrderBillNewMapper.insertBatch(listBull);
  256. temporaryReceivablesMapper.deleteNormalByaid(TokenManager.getAdminId());
  257. }else {
  258. return -1;
  259. }
  260. LoggerUtils.debug(getClass(), "=========================批量导入结束===================");
  261. return 1;
  262. }
  263. private void addOrderLog(String orderNo, Integer code) {
  264. TOrderLog tl=new TOrderLog();
  265. tl.setOrderNo(orderNo);
  266. tl.setProcess(code);
  267. tl.setAid(TokenManager.getAdminId());
  268. tOrderLogMapper.insertSelective(tl);
  269. }
  270. @SuppressWarnings("unchecked")
  271. @Override
  272. public Pagination<ReceivablesListBo> listReceivables(ReceivablesListBo rl,Integer status,String adminName, String adminDepId, String orderDepId, Integer pageSize,
  273. Integer pageNo) {
  274. Map<String,Object> parameter=new HashMap<String, Object>();
  275. if(pageSize==null||pageSize<1)pageSize=10;
  276. if(pageNo==null||pageNo<1)pageNo=1;
  277. if(StringUtils.isNotBlank(rl.getContractNo()))parameter.put("contractNo", rl.getContractNo());
  278. if(StringUtils.isNotBlank(rl.getOrderNo()))parameter.put("orderNo", rl.getOrderNo());
  279. if(StringUtils.isNotBlank(rl.getNickname()))parameter.put("nickname", rl.getNickname());
  280. if(StringUtils.isNotBlank(rl.getCorporateName()))parameter.put("corporateName", rl.getCorporateName());
  281. if(StringUtils.isNotBlank(adminName))parameter.put("adminName", adminName);
  282. if(StringUtils.isNotBlank(adminDepId))parameter.put("adminDepId", adminDepId);
  283. if(StringUtils.isNotBlank(orderDepId))parameter.put("orderDepId", orderDepId);
  284. if(null!=status)parameter.put("status", status);
  285. if(StringUtils.isNotBlank(TokenManager.getAdminId()))parameter.put("aid", TokenManager.getAdminId());
  286. return (Pagination<ReceivablesListBo>) findPage("selectReceivablesList", "selectReceivablesCount", parameter, pageNo, pageSize);
  287. }
  288. @Override
  289. public Map<String, Object> getCountlistReceivables(ReceivablesListBo rl, Integer status, String adminName,
  290. String adminDepId, String orderDepId) {
  291. Map<String,Object> parameter=new HashMap<String, Object>();
  292. if(StringUtils.isNotBlank(rl.getContractNo()))parameter.put("contractNo", rl.getContractNo());
  293. if(StringUtils.isNotBlank(rl.getOrderNo()))parameter.put("orderNo", rl.getOrderNo());
  294. if(StringUtils.isNotBlank(rl.getNickname()))parameter.put("nickname", rl.getNickname());
  295. if(StringUtils.isNotBlank(rl.getCorporateName()))parameter.put("corporateName", rl.getCorporateName());
  296. if(StringUtils.isNotBlank(adminName))parameter.put("adminName", adminName);
  297. if(StringUtils.isNotBlank(adminDepId))parameter.put("adminDepId", adminDepId);
  298. if(StringUtils.isNotBlank(orderDepId))parameter.put("orderDepId", orderDepId);
  299. if(null!=status)parameter.put("status", status);
  300. if(StringUtils.isNotBlank(TokenManager.getAdminId()))parameter.put("aid", TokenManager.getAdminId());
  301. //计算回收表的订单总金额与当前总收款额。
  302. Map<String,Object> map=new HashMap<String, Object>();
  303. map.put("amount", temporaryReceivablesMapper.getCountlistReceivablesAmount(parameter));
  304. map.put("totalAmount", temporaryReceivablesMapper.getCountlistReceivablesTotalAmount(parameter));
  305. return map;
  306. }
  307. @Override
  308. public void batchListReceivables(MultipartFile file) {
  309. //获得Workbook工作薄对象
  310. Workbook workbook = getWorkBook(file);
  311. //创建一个对象,用来存储数据
  312. List<TemporaryReceivablesBo> list=new ArrayList<>();
  313. if(workbook != null){
  314. //获得当前sheet工作表
  315. Sheet sheet = workbook.getSheetAt(0);
  316. if(sheet == null){
  317. return;
  318. }
  319. //获得当前sheet的开始行
  320. int firstRowNum = sheet.getFirstRowNum();
  321. //获得当前sheet的结束行
  322. int lastRowNum = sheet.getLastRowNum();
  323. //处理空白行
  324. for (int i = firstRowNum; i <= sheet.getLastRowNum();i++) {
  325. Row r = sheet.getRow(i);
  326. if(r == null){
  327. // 如果是空行(即没有任何数据、格式),直接把它以下的数据往上移动
  328. sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);
  329. continue;
  330. }
  331. boolean flag = false;
  332. for(Cell c:r){
  333. if(c.getCellType() != Cell.CELL_TYPE_BLANK){
  334. flag = true;
  335. break;
  336. }
  337. }
  338. if(flag){
  339. i++;
  340. continue;
  341. } else{//如果是空白行(即可能没有数据,但是有一定格式)
  342. if(i == sheet.getLastRowNum())//如果到了最后一行,直接将那一行remove掉
  343. sheet.removeRow(r);
  344. else//如果还没到最后一行,则数据往上移一行
  345. sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);
  346. }
  347. }
  348. lastRowNum=sheet.getLastRowNum();
  349. if (lastRowNum<2) {
  350. throw new BusinessException(new Error("未找到正确的参数。"));
  351. }
  352. //循环除了第2行的所有行
  353. for(int rowNum = firstRowNum+2;rowNum <= lastRowNum;rowNum++){
  354. //获得当前行
  355. Row row = sheet.getRow(rowNum);
  356. if(row == null){
  357. continue;
  358. }
  359. //获得当前行的开始列
  360. int firstCellNum = row.getFirstCellNum();
  361. //获得当前行的列数
  362. int lastCellNum = row.getLastCellNum();
  363. //循环当前行 cellNum = (firstCellNum+1) 则是除开第一例
  364. TemporaryReceivablesBo trb=new TemporaryReceivablesBo();
  365. for(int cellNum = (firstCellNum); cellNum < lastCellNum;cellNum++){
  366. Cell cell = row.getCell(cellNum);
  367. try {
  368. switch (cellNum) {
  369. case 0:
  370. trb.setFinancialPayNo(getCellValue(cell));
  371. break;
  372. case 1:
  373. trb.setOrderNo(getCellValue(cell));
  374. break;
  375. case 2:
  376. trb.setCorporateName(getCellValue(cell));
  377. break;
  378. case 3:
  379. trb.setAmount(new BigDecimal((getCellValue(cell).equals("")?"0":getCellValue(cell))));
  380. break;
  381. case 4:
  382. trb.setReceivablesTime(DateUtils.StringToDate(getCellValue(cell), AFTConstants.YYYYMMDD));
  383. break;
  384. case 5:
  385. trb.setRemarks(getCellValue(cell));
  386. break;
  387. }
  388. } catch (ParseException e) {
  389. throw new BusinessException(new Error("表格第"+(rowNum+1)+"行输入内容不正确。"));
  390. }
  391. }
  392. trb.setAid(TokenManager.getAdminId());
  393. trb.setCreateTime(new Date());
  394. trb.setStatus(0);
  395. list.add(trb);
  396. }
  397. }
  398. temporaryReceivablesMapper.insertBatch(list);
  399. //计算重复的单
  400. temporaryReceivablesMapper.updateRepeatOrderNo(TokenManager.getAdminId());
  401. }
  402. public static Workbook getWorkBook(MultipartFile file) {
  403. //创建Workbook工作薄对象,表示整个excel
  404. Workbook workbook = null;
  405. try {
  406. //获取excel文件的io流
  407. InputStream is = file.getInputStream();
  408. //如果是xls,使用HSSFWorkbook;如果是xlsx,使用XSSFWorkbook
  409. if(file.getOriginalFilename().matches("^.+\\.(?i)(xls)$"))workbook = new HSSFWorkbook(is);
  410. if(file.getOriginalFilename().matches("^.+\\.(?i)(xlsx)$"))workbook = new XSSFWorkbook(is);
  411. } catch (IOException e) {
  412. }
  413. return workbook;
  414. }
  415. @SuppressWarnings("deprecation")
  416. public static String getCellValue(Cell cell){
  417. String cellValue = "";
  418. if(cell == null){
  419. return cellValue;
  420. }
  421. //把数字当成String来读,避免出现1读成1.0的情况
  422. if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
  423. cell.setCellType(Cell.CELL_TYPE_STRING);
  424. }
  425. //判断数据的类型
  426. switch (cell.getCellType()){
  427. case Cell.CELL_TYPE_NUMERIC: //数字
  428. cellValue = String.valueOf(cell.getNumericCellValue());
  429. break;
  430. case Cell.CELL_TYPE_STRING: //字符串
  431. cellValue = String.valueOf(cell.getStringCellValue());
  432. break;
  433. case Cell.CELL_TYPE_BOOLEAN: //Boolean
  434. cellValue = String.valueOf(cell.getBooleanCellValue());
  435. break;
  436. case Cell.CELL_TYPE_FORMULA: //公式
  437. cellValue = String.valueOf(cell.getCellFormula());
  438. break;
  439. case Cell.CELL_TYPE_BLANK: //空值
  440. cellValue = "未知";
  441. break;
  442. case Cell.CELL_TYPE_ERROR: //故障
  443. cellValue = "非法字符";
  444. break;
  445. default:
  446. cellValue = "未知类型";
  447. break;
  448. }
  449. return cellValue;
  450. }
  451. @SuppressWarnings("unchecked")
  452. @Override
  453. public void exportReceivables(HttpServletResponse response,OrderListBo order, Integer pageSize, Integer pageNo) throws Exception {
  454. OutputStream out = response.getOutputStream();
  455. // 财务专员自己的id
  456. order.setFinanceId(TokenManager.getAdminId());
  457. //order.setProcessStatus(3);//分配给自己 改为前端 传3未分配 4已分配
  458. order.setOrderStatus(2);//营销管理员审核通过
  459. if(pageSize==null||pageSize<0)pageSize=9999;
  460. if(pageNo==null||pageNo<0)pageNo=1;
  461. Pagination<OrderListBo> p=(Pagination<OrderListBo>) fundManageOrderService.financeList(order, pageNo, pageSize).get("pagination");
  462. List<OrderListBo> list=(List<OrderListBo>)p.getList() ;
  463. if(list.isEmpty())throw new BusinessException(new Error("数据是空的。","数据是空的。"));
  464. try {
  465. //设计表头
  466. String[] comment = {"订单编号", "合同编号","客户名称","订单部门","订单负责人","签单日期","下单日期",
  467. "签单金额(万元)", "已开票金额(万元)", "已收金额(万元)","最近收款(万元)","最近收款时间","结算状态","订单流程","是否特批"};
  468. String fileName = "收款结算列表" + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + ".xls";
  469. XSSFWorkbook wb =exportTemplateInfoS(comment,"收款结算",list,0);
  470. //根据列表编写文档
  471. //返回名称及参数
  472. response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(),"iso-8859-1"));
  473. response.setContentType("application/octet-stream;charset=utf-8");
  474. // 返回数据流
  475. wb.write(out);
  476. out.flush();
  477. out.close();
  478. } catch (Exception e) {
  479. throw new BusinessException(new Error("表格生成错误。"));
  480. }finally {
  481. out.flush();
  482. out.close();
  483. }
  484. }
  485. @SuppressWarnings("unchecked")
  486. @Override
  487. public void exportInvoice(HttpServletResponse response, String orderNo, Integer pageSize, Integer pageNo)throws Exception {
  488. OutputStream out = response.getOutputStream();
  489. if(pageSize==null||pageSize<0)pageSize=9999;
  490. if(pageNo==null||pageNo<0)pageNo=1;
  491. List<TOrderInvoiceBo>list=(List<TOrderInvoiceBo>) orderInvoiceService.salesmanOrderInvoiceList( orderNo, pageNo,pageSize).getList();
  492. // if(list.isEmpty())throw new BusinessException(new Error("数据是空的。"));
  493. try {
  494. //设计表头
  495. String[] comment = {"编号","订单编号","开票金额(万元)","申请时间","开票状态"};
  496. String fileName = orderNo+"开票记录列表" + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + ".xls";
  497. //type 0 收款 1开票 2流水
  498. XSSFWorkbook wb =exportTemplateInfoS(comment,"开票记录",list,1);
  499. //根据列表编写文档
  500. //返回名称及参数
  501. response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(),"iso-8859-1"));
  502. response.setContentType("application/octet-stream;charset=utf-8");
  503. // 返回数据流
  504. wb.write(out);
  505. out.flush();
  506. out.close();
  507. } catch (Exception e) {
  508. throw new BusinessException(new Error("表格生成错误。"));
  509. }finally {
  510. out.flush();
  511. out.close();
  512. }
  513. }
  514. @SuppressWarnings("unchecked")
  515. @Override
  516. public void exportMyBill(HttpServletResponse response, String orderNo, Integer pageSize, Integer pageNo)throws Exception {
  517. OutputStream out = response.getOutputStream();
  518. if(pageSize==null||pageSize<0)pageSize=9999;
  519. if(pageNo==null||pageNo<0)pageNo=1;
  520. TOrderBillNew billNew=new TOrderBillNew();
  521. billNew.setOrderNo(orderNo);
  522. List<TOrderBillNew>list=(List<TOrderBillNew>) orderBillService.myBillList(billNew, pageNo, pageSize).getList();
  523. try {
  524. //设计表头
  525. String[] comment = {"订单编号","合同编号","收款时间","财务流水时间","财务流水号","金额(万元)","收款方","付款方","流水科目","平台流水号","收款类型","备注"};
  526. String fileName = orderNo+"流水记录列表" + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()) + ".xls";
  527. //type 0 收款 1开票 2流水
  528. XSSFWorkbook wb =exportTemplateInfoS(comment,"流水记录",list,2);
  529. //根据列表编写文档
  530. //返回名称及参数
  531. response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(),"iso-8859-1"));
  532. response.setContentType("application/octet-stream;charset=utf-8");
  533. // 返回数据流
  534. wb.write(out);
  535. out.flush();
  536. out.close();
  537. } catch (Exception e) {
  538. throw new BusinessException(new Error("表格生成错误。"));
  539. }finally {
  540. out.flush();
  541. out.close();
  542. }
  543. }
  544. /**
  545. *
  546. * @param comment
  547. * @param fileName
  548. * @param list
  549. * @param type 0收款 1开票 2流水
  550. * @return
  551. */
  552. public static XSSFWorkbook exportTemplateInfoS(String[] comment,String fileName,List<?> list,Integer type){
  553. //map 数据 ,comment表头 (列名称)
  554. //1,创建一个workbook,对应的是一个excel文件
  555. XSSFWorkbook wb = new XSSFWorkbook();
  556. //遍历map
  557. XSSFSheet sheet = wb.createSheet(fileName);
  558. //3。创建一个row
  559. XSSFRow row = sheet.createRow(0);
  560. //4.创建一个cell
  561. XSSFCell cell = row.createCell(0);
  562. cell.setCellValue(fileName+"列表");
  563. XSSFCellStyle style1 = ExportExcelUtil.setCellStyle1(wb);//标题
  564. XSSFCellStyle style2 = ExportExcelUtil.setCellStyle2(wb);//正文
  565. cell.setCellStyle(style1);
  566. //合并列
  567. sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, comment.length-1));//合并单元格
  568. //设置其他单位格式
  569. //创建表头
  570. XSSFRow row2 = sheet.createRow(1);
  571. for(int i = 0; i < comment.length; i++){
  572. sheet.setColumnWidth(i, 3000);//设置列宽
  573. XSSFCell c = row2.createCell(i);
  574. c.setCellValue(comment[i]);
  575. c.setCellStyle(style2);
  576. }
  577. switch (type) {
  578. case 0:
  579. addSettlementReceivablesList(comment, list, sheet);
  580. break;
  581. case 1:
  582. addSettlementInvoiceList(comment, list, sheet);
  583. break;
  584. case 2:
  585. addSettlementMyBillList(comment, list, sheet);
  586. break;
  587. }
  588. return wb;
  589. }
  590. @SuppressWarnings("unchecked")
  591. private static void addSettlementMyBillList(String[] comment, List<?> list, XSSFSheet sheet) {
  592. for (TOrderBillNew ob : (List<TOrderBillNew>)list) {
  593. //新增一行
  594. XSSFRow r = sheet.createRow(sheet.getLastRowNum()+1);
  595. for (int i = 0; i < comment.length; i++) {
  596. //当前列的只
  597. String o = "";
  598. switch (comment[i]) {
  599. // String[] comment = {"订单编号","合同编号","收款时间","财务流水时间","财务流水号","金额(万元)","收款方","付款方","流水科目","平台流水号","收款类型","备注"};
  600. case "订单编号": o = ob.getOrderNo(); break;
  601. case "合同编号": o = ob.getContractNo(); break;
  602. case "收款时间": o = ob.getCreateTimes(); break;
  603. case "财务流水时间": o = ob.getFinancialPayTimes(); break;
  604. case "财务流水号": o = ob.getFinancialPayNo(); break;
  605. case "金额(万元)": o = ob.getTransactionAmount().toString(); break;
  606. case "收款方": o = ob.getPayeeName(); break;
  607. case "付款方": o = ob.getPayerName(); break;
  608. case "流水科目": o = TransactionSubject.getValueByCode(ob.getTransactionSubject()); break;
  609. case "平台流水号": o = ob.getBillNo(); break;
  610. case "收款类型":
  611. if(ob.getType()==0) {
  612. o = "手工收款"; break;
  613. }else if(ob.getType()==1) {
  614. o = "批量收款"; break;
  615. }
  616. case "备注": o = ob.getRemarks(); break;
  617. default: o = ""; break;
  618. }
  619. XSSFCell c = r.createCell(i);
  620. c.setCellValue(o);
  621. }
  622. }
  623. }
  624. @SuppressWarnings("unchecked")
  625. private static void addSettlementInvoiceList(String[] comment, List<?> list, XSSFSheet sheet) {
  626. for (TOrderInvoiceBo ob : (List<TOrderInvoiceBo>)list) {
  627. //新增一行
  628. XSSFRow r = sheet.createRow(sheet.getLastRowNum()+1);
  629. for (int i = 0; i < comment.length; i++) {
  630. //当前列的只
  631. String o = "";
  632. switch (comment[i]) {
  633. // String[] comment = {"编号","订单编号","开票金额(万元)","申请时间","开票状态"};
  634. case "编号": o = ob.getId().toString(); break;
  635. case "订单编号": o = ob.getOrderno(); break;
  636. case "开票金额(万元)": o = ob.getAmount().toString(); break;
  637. case "申请时间": o = ob.getCreateTime(); break;
  638. case "开票状态":
  639. // 状态 0未提交 1处理中 2通过 3拒绝 4 撤销
  640. switch(ob.getStatus()) {
  641. case 1 :o = "处理中"; break;
  642. case 2 :o = "通过"; break;
  643. }
  644. break;
  645. default: o = ""; break;
  646. }
  647. XSSFCell c = r.createCell(i);
  648. c.setCellValue(o);
  649. }
  650. }
  651. }
  652. @SuppressWarnings("unchecked")
  653. private static void addSettlementReceivablesList(String[] comment, List<?> list, XSSFSheet sheet) {
  654. for (OrderListBo ob : (List<OrderListBo>)list) {
  655. //新增一行
  656. XSSFRow r = sheet.createRow(sheet.getLastRowNum()+1);
  657. for (int i = 0; i < comment.length; i++) {
  658. //当前列的只
  659. String o = "";
  660. switch (comment[i]) {
  661. // "订单编号", "合同编号","客户名称","订单部门","订单负责人","签单日期","下单日期",
  662. // "签单金额(万元)", "已开票金额(万元)", "已收金额(万元)","最近收款(万元)","结算状态","订单流程","是否特批"}
  663. case "订单编号": o = ob.getOrderNo().toString(); break;
  664. case "合同编号": o = ob.getContractNo(); break;
  665. case "客户名称": o = ob.getBuyerName(); break;
  666. case "订单部门": o = ob.getDepartmentName(); break;
  667. case "订单负责人": o = ob.getSellerName(); break;
  668. case "签单日期": o = ob.getSignTime(); break;
  669. case "下单日期": o = ob.getCreateTime(); break;
  670. case "签单金额(万元)":o=ob.getSignTotalAmount();break;
  671. case "已开票金额(万元)":o=ob.getInvoiceAmount();break;
  672. case "已收金额(万元)":o=ob.getActuallyTotalAmount();break;
  673. case "最近收款(万元)":o=ob.getFinalReceivables();break;
  674. case "最近收款时间":o=ob.getFinalReceivablesTime();break;
  675. case "结算状态":o=LiquidationNewState.getValueByCode(ob.getLiquidationStatus());break;
  676. case "订单流程":o=ProcessStatus.getValueByCode(ob.getProcessStatus());break;
  677. case "是否特批":o=ApprovalNewState.getValueByCode(ob.getApproval());break;
  678. default: o = ""; break;
  679. }
  680. XSSFCell c = r.createCell(i);
  681. c.setCellValue(o);
  682. }
  683. }
  684. }
  685. }