package com.java110.job.printer.manufactor; import com.java110.core.client.RestTemplate; import com.java110.core.log.LoggerFactory; import com.java110.dto.account.AccountReceiptDto; import com.java110.dto.fee.FeeDetailDto; import com.java110.dto.fee.FeeDto; import com.java110.dto.fee.FeeReceiptDetailDto; import com.java110.dto.fee.FeeReceiptDto; import com.java110.dto.machine.MachinePrinterDto; import com.java110.dto.repair.RepairDto; import com.java110.dto.repair.RepairUserDto; import com.java110.intf.community.IRepairInnerServiceSMO; import com.java110.intf.community.IRepairUserInnerServiceSMO; import com.java110.intf.fee.*; import com.java110.intf.store.ISmallWeChatInnerServiceSMO; import com.java110.intf.user.IUserV1InnerServiceSMO; import com.java110.job.printer.IPrinter; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.MappingConstant; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.utils.util.DateUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.apache.commons.codec.digest.DigestUtils; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 飞蛾厂家云打印机 *

* http://www.feieyun.com/open/apidoc-cn.html */ @Service("feieManufactor") public class FeieManufactor implements IPrinter { private Logger logger = LoggerFactory.getLogger(FeieManufactor.class); @Autowired private RestTemplate formRestTemplate; /** * 请求地址 * http://api.feieyun.cn/Api/Open/ */ public static final String REQUEST_URL = "http://api.feieyun.cn/Api/Open/"; @Autowired private IFeeInnerServiceSMO feeInnerServiceSMOImpl; @Autowired private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl; @Autowired private IFeeReceiptDetailInnerServiceSMO feeReceiptDetailInnerServiceSMOImpl; @Autowired private IFeeReceiptInnerServiceSMO feeReceiptInnerServiceSMOImpl; @Autowired private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl; @Autowired private IRepairUserInnerServiceSMO repairUserInnerServiceSMO; @Autowired private IRepairInnerServiceSMO repairInnerServiceSMO; @Autowired private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl; @Autowired private IAccountReceiptV1InnerServiceSMO accountReceiptV1InnerServiceSMOImpl; /** * ************************** * 单号:832023020800440026 * 房号:1-1-1001 * 业主:李四1 * 时间:2023-02-08 14:30:17 * ************************** * 收费项目:高层物业费 * 收费范围:2024-01-01 至2024-12-31 * 单价/固定费:1.3/0.0 * 面积/用量:90.00 * 金额: 1404.00 * 备注:123 * ************************** * 总计:1404 * ************************** * * @param detailIds * @param communityId * @param quantity * @return */ @Override public ResultVo printPayFeeDetail(String[] detailIds, String communityId, int quantity, MachinePrinterDto machinePrinterDto, String staffName) { String printStr = ""; FeeDetailDto feeDetailDto = new FeeDetailDto(); feeDetailDto.setDetailId(detailIds[0]); feeDetailDto.setCommunityId(communityId); List feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto); Assert.listOnlyOne(feeDetailDtos, "交费明细不存在"); FeeReceiptDetailDto feeReceiptDetailDto = new FeeReceiptDetailDto(); feeReceiptDetailDto.setDetailIds(detailIds); feeReceiptDetailDto.setCommunityId(communityId); List feeReceiptDetailDtos = feeReceiptDetailInnerServiceSMOImpl.queryFeeReceiptDetails(feeReceiptDetailDto); if (feeReceiptDetailDtos == null || feeReceiptDetailDtos.size() < 1) { throw new CmdException("未生成收据"); } FeeReceiptDto feeReceiptDto = new FeeReceiptDto(); feeReceiptDto.setReceiptId(feeReceiptDetailDtos.get(0).getReceiptId()); feeReceiptDto.setCommunityId(communityId); List feeReceiptDtos = feeReceiptInnerServiceSMOImpl.queryFeeReceipts(feeReceiptDto); Assert.listOnlyOne(feeReceiptDtos, "未生成收据"); /*************************************头部******************************************/ List feieLines = new ArrayList<>(); feieLines.add(new FeieLine("单号", feeReceiptDetailDtos.get(0).getPayOrderId())); feieLines.add(new FeieLine("房号", feeReceiptDtos.get(0).getObjName())); feieLines.add(new FeieLine("业主", feeReceiptDtos.get(0).getPayObjName())); feieLines.add(new FeieLine("时间", DateUtil.getFormatTimeString(DateUtil.getCurrentDate(), DateUtil.DATE_FORMATE_STRING_A))); printStr = FeieGetPayFeeDetail.getPrintPayFeeDetailHeaderContent(feieLines); /*************************************头部******************************************/ feieLines = new ArrayList<>(); Date startTime = null; Date endTime = null; Calendar endTimeCal = null; BigDecimal totalDecimal = new BigDecimal(0); for (FeeReceiptDetailDto tmpFeeReceiptDetailDto : feeReceiptDetailDtos) { feieLines.add(new FeieLine("收费项目", tmpFeeReceiptDetailDto.getFeeName())); startTime = DateUtil.getDateFromStringB(tmpFeeReceiptDetailDto.getStartTime()); endTime = DateUtil.getDateFromStringB(tmpFeeReceiptDetailDto.getEndTime()); //周期性和间接性 if (!FeeDto.FEE_FLAG_ONCE.equals(tmpFeeReceiptDetailDto.getFeeFlag())) { endTimeCal = Calendar.getInstance(); endTimeCal.setTime(endTime); endTimeCal.add(Calendar.DAY_OF_MONTH, -1); endTime = endTimeCal.getTime(); } feieLines.add(new FeieLine("收费范围", DateUtil.getFormatTimeString(startTime, DateUtil.DATE_FORMATE_STRING_B) + "至" + DateUtil.getFormatTimeString(endTime, DateUtil.DATE_FORMATE_STRING_B))); feieLines.add(new FeieLine("单价/固定费", tmpFeeReceiptDetailDto.getSquarePrice())); feieLines.add(new FeieLine("面积/用量", tmpFeeReceiptDetailDto.getArea())); feieLines.add(new FeieLine("支付方式", tmpFeeReceiptDetailDto.getPrimeRate())); if (!StringUtil.isEmpty(tmpFeeReceiptDetailDto.getPreDegrees())) { feieLines.add(new FeieLine("表读数", tmpFeeReceiptDetailDto.getPreDegrees() + "至" + tmpFeeReceiptDetailDto.getCurDegrees())); } feieLines.add(new FeieLine("金额", tmpFeeReceiptDetailDto.getAmount())); feieLines.add(new FeieLine("备注", tmpFeeReceiptDetailDto.getRemark())); printStr += FeieGetPayFeeDetail.getPrintPayFeeDetailBodyContent(feieLines); totalDecimal = totalDecimal.add(new BigDecimal(Double.parseDouble(tmpFeeReceiptDetailDto.getAmount()))); } printStr += FeieGetPayFeeDetail.getPrintPayFeeDetailFloorContent(communityId, totalDecimal.doubleValue(), staffName, smallWeChatInnerServiceSMOImpl); doPrint(quantity, machinePrinterDto, printStr); return new ResultVo(ResultVo.CODE_OK, "成功"); } @Override public ResultVo printRepair(String ruId, String communityId, int quantity, MachinePrinterDto machinePrinterDto) { RepairUserDto repairUserDto = new RepairUserDto(); repairUserDto.setRuId(ruId); repairUserDto.setCommunityId(communityId); List repairUserDtos = repairUserInnerServiceSMO.queryRepairUsers(repairUserDto); Assert.listOnlyOne(repairUserDtos, "报修单不存在"); if (RepairUserDto.STATE_SUBMIT.equals(repairUserDtos.get(0).getState())) { return new ResultVo(ResultVo.CODE_OK, "成功"); } String repairId = repairUserDtos.get(0).getRepairId(); RepairDto repairDto = new RepairDto(); repairDto.setRepairId(repairId); repairDto.setCommunityId(communityId); List repairDtos = repairInnerServiceSMO.queryRepairs(repairDto); Assert.listOnlyOne(repairDtos, "报修单不存在"); String staffName = repairUserDtos.get(0).getStaffName(); String printStr = ""; /*************************************内容******************************************/ List feieLines = new ArrayList<>(); feieLines.add(new FeieLine("标题", repairDtos.get(0).getRepairName())); feieLines.add(new FeieLine("联系人", repairDtos.get(0).getRepairName())); feieLines.add(new FeieLine("电话", repairDtos.get(0).getTel())); feieLines.add(new FeieLine("时间", repairDtos.get(0).getAppointmentTime())); feieLines.add(new FeieLine("位置", repairDtos.get(0).getRepairObjName())); feieLines.add(new FeieLine("维修师傅", staffName)); feieLines.add(new FeieLine("单号", repairDtos.get(0).getRepairId())); feieLines.add(new FeieLine("内容", repairDtos.get(0).getContext())); printStr = FeieGetRepair.getPrintRepairHeaderContent(feieLines); /*************************************内容******************************************/ doPrint(quantity, machinePrinterDto, printStr); return new ResultVo(ResultVo.CODE_OK, "成功"); } @Override public ResultVo printAccountReceipt(String[] arIds, String communityId, int quantity, MachinePrinterDto machinePrinterDto, String name) { String printStr = ""; AccountReceiptDto accountReceiptDto = new AccountReceiptDto(); accountReceiptDto.setArIds(arIds); accountReceiptDto.setCommunityId(communityId); List accountReceiptDtos = accountReceiptV1InnerServiceSMOImpl.queryAccountReceipts(accountReceiptDto); if(accountReceiptDtos == null || accountReceiptDtos.size() < 1){ throw new CmdException("没有打印内容"); } /*************************************头部******************************************/ List feieLines = new ArrayList<>(); feieLines.add(new FeieLine("单号", accountReceiptDtos.get(0).getArId())); feieLines.add(new FeieLine("时间", DateUtil.getFormatTimeString(DateUtil.getCurrentDate(), DateUtil.DATE_FORMATE_STRING_A))); printStr = FeieGetPayFeeDetail.getPrintPayFeeDetailHeaderContent(feieLines); /*************************************头部******************************************/ feieLines = new ArrayList<>(); BigDecimal totalDecimal = new BigDecimal(0); for (AccountReceiptDto tmpAccountReceiptDto : accountReceiptDtos) { feieLines.add(new FeieLine("账户名称", tmpAccountReceiptDto.getAcctName())); feieLines.add(new FeieLine("账户类型", tmpAccountReceiptDto.getAcctTypeName())); feieLines.add(new FeieLine("业主", tmpAccountReceiptDto.getOwnerName())); feieLines.add(new FeieLine("预存金额", tmpAccountReceiptDto.getReceivedAmount())); feieLines.add(new FeieLine("预存方式", tmpAccountReceiptDto.getPrimeRateName())); feieLines.add(new FeieLine("当前余额", tmpAccountReceiptDto.getAmount())); feieLines.add(new FeieLine("备注", tmpAccountReceiptDto.getRemark())); printStr += FeieGetPayFeeDetail.getPrintPayFeeDetailBodyContent(feieLines); totalDecimal = totalDecimal.add(new BigDecimal(Double.parseDouble(tmpAccountReceiptDto.getAmount()))); } printStr += FeieGetPayFeeDetail.getPrintPayFeeDetailFloorContent(communityId, totalDecimal.doubleValue(), name, smallWeChatInnerServiceSMOImpl); doPrint(quantity, machinePrinterDto, printStr); return new ResultVo(ResultVo.CODE_OK, "成功"); } private static String signature(String USER, String UKEY, String STIME) { return DigestUtils.sha1Hex(USER + UKEY + STIME); } private static void doPrint(int quantity, MachinePrinterDto machinePrinterDto, String printStr) { String stime = String.valueOf(System.currentTimeMillis() / 1000); String user = MappingCache.getValue(MappingConstant.FEIE_DOMAIN, "user"); String ukey = MappingCache.getValue(MappingConstant.FEIE_DOMAIN, "ukey"); // 通过POST请求,发送打印信息到服务器 RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(30000)// 读取超时 .setConnectTimeout(30000)// 连接超时 .build(); CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build(); HttpPost post = new HttpPost(REQUEST_URL); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("user", user)); nvps.add(new BasicNameValuePair("stime", stime)); nvps.add(new BasicNameValuePair("sig", signature(user, ukey, stime))); nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));// 固定值,不需要修改 nvps.add(new BasicNameValuePair("sn", machinePrinterDto.getMachineCode())); nvps.add(new BasicNameValuePair("content", printStr)); nvps.add(new BasicNameValuePair("times", quantity + ""));// 打印联数 CloseableHttpResponse response = null; String result = null; try { post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); response = httpClient.execute(post); int statecode = response.getStatusLine().getStatusCode(); if (statecode == 200) { HttpEntity httpentity = response.getEntity(); if (httpentity != null) { // 服务器返回的JSON字符串,建议要当做日志记录起来 result = EntityUtils.toString(httpentity); System.out.println(result); } } } catch (Exception e) { e.printStackTrace(); } finally { close(response, post, httpClient); } } public static void close(CloseableHttpResponse response, HttpPost post, CloseableHttpClient httpClient) { try { if (response != null) { response.close(); } } catch (IOException e) { e.printStackTrace(); } try { post.abort(); } catch (Exception e) { e.printStackTrace(); } try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } }