/** * */ package com.zteits.pay.biz.ticket; import cn.hutool.core.collection.CollectionUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.clouds.common.utils.ListCopyUtil; import com.clouds.common.utils.SequenceUtil; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.constants.DataStatusEnum; import com.zteits.clouds.api.apibase.constants.ErrorType; import com.zteits.clouds.api.apibase.constants.SequenceTypeEnum; import com.zteits.clouds.api.apibase.constants.WidgetTypeEnum; import com.zteits.clouds.api.apibase.exception.BizException; import com.zteits.clouds.api.dto.pay.ChargerTicketTemplateDTO; import com.zteits.clouds.api.dto.pay.param.ChargerTicketConfigRequest; import com.zteits.clouds.api.dto.pay.param.ChargerTicketRequest; import com.zteits.clouds.api.dto.pay.param.SaveChargerTicketConfigsRequest; import com.zteits.clouds.api.service.pay.ticket.ChargerTicketService; import com.zteits.pay.dao.ChargerTicketConfigDao; import com.zteits.pay.dao.ChargerTicketTemplateDao; import com.zteits.pay.domain.ChargerTicketBaseConfig; import com.zteits.pay.domain.ChargerTicketConfig; import com.zteits.pay.domain.ChargerTicketTemplate; import com.zteits.pay.domain.ChargerTicketTemplateExample; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * Copyright: Copyright (c) 2020 zteits * * @ClassName: ChargerTicketServiceImpl * @Description: * @version: v1.0.0 * @author: wangfei * @date: 2020-02-20 上午11:45:31 * Modification History: * Date Author Version Description *---------------------------------------------------------* * 2020-02-20 wangfei v1.0.0 创建 */ @Service("com.zteits.pay.biz.ticket.ChargerTicketServiceImpl") public class ChargerTicketServiceImpl implements ChargerTicketService { private static final Logger logger = LoggerFactory.getLogger(ChargerTicketServiceImpl.class); @Autowired private ChargerTicketConfigDao chargerTicketConfigDao; @Autowired private ChargerTicketTemplateDao chargerTicketTemplateDao; private final static Integer ticketWide = 18; /**不需要切割的LABEL_INPUT控件*/ private final static List noCutNames = Arrays.asList("orderId","parkInTimeStr","parkOutTimeStr","customerPhone","servicePhone","line"); /**需要分隔上下两段文字的图片控件*/ private final static List picNames = Arrays.asList("appQrCode","inParkQrCode","outParkQrCode"); @Override @Transactional public BizResult saveChargerTicketConfigsAndTemplate(SaveChargerTicketConfigsRequest request) { String ticketNo = SequenceUtil.getNextId(SequenceTypeEnum.TICKET_NO); request.setTicketNo(ticketNo); logger.info("(预览)保存小票配置信息入参{}", JSONObject.toJSON(request)); if(request.getOrgId() == null){ throw new BizException(ErrorType.PARAMM_NULL,"组织编码为空!"); } if(StringUtils.isBlank(request.getTicketTitle())){ throw new BizException(ErrorType.PARAMM_NULL,"小票标题为空!"); } if(CollectionUtil.isEmpty(request.getConfigRequests())){ throw new BizException(ErrorType.PARAMM_NULL,"配置信息为空!"); } if(request.getTicketCategory() == null){ throw new BizException(ErrorType.PARAMM_NULL,"小票类别为空!"); } if(request.getTicketType() == null){ throw new BizException(ErrorType.PARAMM_NULL,"小票类型为空!"); } //查询基础数据 List wigetNos = request.getConfigRequests().stream().map(item -> item.getWidgetNo()).collect(Collectors.toList()); List bases = chargerTicketConfigDao.queryChargerTicketBaseConfigsByCondition(wigetNos, request.getTicketType(), request.getTicketCategory(), request.getOrgId()); if(CollectionUtils.isEmpty(bases)){ throw new BizException(ErrorType.BIZ_ERROR,"未查询到相关基础配置信息!"); } //填充小票配置信息 this.fillTiketConfigs(request, ticketNo, bases); List configs = new ArrayList<>(); ListCopyUtil.listCopyProperties(request.getConfigRequests(),configs,ChargerTicketConfig.class); //生成模板信息 String ticketTemplateText = this.generateTemplateText(configs); logger.info("模板生成:{},{}",ticketNo,ticketTemplateText); int ins = chargerTicketConfigDao.bathSaveChargerTicketConfigs(configs); if(ins < 1){ throw new BizException(ErrorType.BIZ_ERROR,"报存配置信息错误!"); } //保存模板信息 ChargerTicketTemplate template = new ChargerTicketTemplate(); BeanUtils.copyProperties(request,template); template.setTicketNo(ticketNo); template.setTicketType(request.getTicketType()); template.setTicketCategory(request.getTicketCategory()); template.setCreateEmpId(request.getCreateEmpId()); template.setCreateEmpName(request.getCreateEmpName()); template.setOrgId(request.getOrgId()); template.setRemark(request.getRemark()); template.setTicketTitle(request.getTicketTitle()); template.setTicketTemplateText(ticketTemplateText); template.setTicketState(DataStatusEnum.DATA_STATUS_NO_VALID.value()); logger.info("保存小票模板信息:{}",JSONObject.toJSON(template)); int ins2 = chargerTicketTemplateDao.saveChargerTicketTemplate(template); if(ins2 < 1){ throw new BizException(ErrorType.BIZ_ERROR,"保存模板信息错误!"); } return new BizResult<>(ticketNo); } /** * 填充小票配置信息 * @param request * @param ticketNo * @param bases */ private void fillTiketConfigs(SaveChargerTicketConfigsRequest request, String ticketNo, List bases) { for (ChargerTicketConfigRequest configRequest : request.getConfigRequests()) { configRequest.setTicketNo(ticketNo); configRequest.setTicketType(request.getTicketType()); configRequest.setTicketCategory(request.getTicketCategory()); configRequest.setCreateEmpId(request.getCreateEmpId()); configRequest.setCreateEmpName(request.getCreateEmpName()); configRequest.setOrgId(request.getOrgId()); configRequest.setRemark(request.getRemark()); for(ChargerTicketBaseConfig b : bases) { if((configRequest.getWidgetNo()).equals(b.getWidgetNo())){ if(StringUtils.isEmpty(configRequest.getWidgetName())){ configRequest.setWidgetName(b.getWidgetName()); } if(null ==(configRequest.getWidgetText())){ configRequest.setWidgetText(b.getWidgetText()); } if(StringUtils.isEmpty(configRequest.getWidgetType())){ configRequest.setWidgetType(b.getWidgetType()); } if(StringUtils.isEmpty(configRequest.getWidgetValue())){ configRequest.setWidgetValue(b.getWidgetValue()); } } } } } @Override public BizResult queryChargerTicketTemplateByCondition(ChargerTicketRequest req) { logger.info("根据小票模板查询小票预览信息{}",JSONObject.toJSON(req)); if(req.getOrgId() == null){ throw new BizException(ErrorType.PARAMM_NULL,"组织编码为空!"); } ChargerTicketTemplate t = chargerTicketTemplateDao.queryChargerTicketTemplateByCondition(req); if(t == null){ throw new BizException(ErrorType.BIZ_ERROR,"未查询到小票模板信息,请联系管理员!"); } ChargerTicketTemplateDTO dto = new ChargerTicketTemplateDTO(); BeanUtils.copyProperties(t,dto); return new BizResult<>(dto); } @Override public BizResult openChargerTicketTemplate(ChargerTicketRequest request) { if(request.getOrgId() == null){ throw new BizException(ErrorType.PARAMM_NULL,"组织编码为空!"); } if(StringUtils.isBlank(request.getTicketNo())){ throw new BizException(ErrorType.PARAMM_NULL,"小票编码为空!"); } //将该类型其他的小票置为预览中 ChargerTicketTemplate template = chargerTicketTemplateDao.queryChargerTicketTemplateByCondition(request); if(template == null){ throw new BizException(ErrorType.BIZ_ERROR,"未查询到当前小票模板信息"); } ChargerTicketTemplate record = new ChargerTicketTemplate(); record.setTicketState(DataStatusEnum.DATA_STATUS_FROZEN.value()); record.setModifyTime(new Date()); record.setModifyEmpId(request.getModifyEmpId()); record.setModifyEmpName(request.getModifyEmpName()); record.setRemark("有新模板启用,锁定旧的"); ChargerTicketTemplateExample example = new ChargerTicketTemplateExample(); example.createCriteria().andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andOrgIdEqualTo(request.getOrgId()).andTicketCategoryEqualTo(template.getTicketCategory()) .andTicketTypeEqualTo(template.getTicketType()).andTicketStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); chargerTicketTemplateDao.updateChargerTicketTemplateByExample(example,record); //启用当前模板 request.setTicketState(DataStatusEnum.DATA_STATUS_VALID.value()); logger.info("启用小票模板{}",JSONObject.toJSON(request)); request.setRemark("当前记录为最新启用模板"); Boolean result = chargerTicketTemplateDao.updateChargerTicketTemplateByNo(request); return new BizResult<>(result); } /** * 根据小票配置信息生成模板数据 * @param configs * @return */ private static String generateTemplateText(List configs){ logger.info("小票配置信息,生成模板:{}",JSONObject.toJSON(configs)); int i=1; for (ChargerTicketConfig config : configs) { if (config.getWidgetName() == null) { config.setWidgetName(""); } if (config.getWidgetText() == null) { config.setWidgetText(""); } if (config.getWidgetValue() == null) { config.setWidgetValue(""); } if (config.getEnterFlag() == null) { config.setEnterFlag(1); } config.setOrderNum(i++); } String text = ""; for (ChargerTicketConfig config : configs) { String value = ""; if( ((WidgetTypeEnum.INPUT.value()).equals(config.getWidgetType())) ||//INPUT ((WidgetTypeEnum.TEXT.value()).equals(config.getWidgetType())) //TEXT ){ if(noCutNames.contains(config.getWidgetName())){//订单编号/电话号和时间不切割 value = (config.getWidgetText()); }else { // value = cutTextValueByLength(config.getWidgetText(), ticketWide); value = (config.getWidgetText()) ; } }else if(((WidgetTypeEnum.LABEL_INPUT.value()).equals(config.getWidgetType()))){//LABEL_INPUT if(noCutNames.contains(config.getWidgetName())){//订单编号/电话号和时间不切割 value = (config.getWidgetText() + config.getWidgetValue()); }else{ // value = cutTextValueByLength(config.getWidgetText() + config.getWidgetValue(),ticketWide);//切割 value = (config.getWidgetText() + config.getWidgetValue()) +" ";//切割 } } else if(((WidgetTypeEnum.PICTURE.value()).equals(config.getWidgetType()))){//PICTURE value = config.getWidgetText(); if(picNames.contains(config.getWidgetName())){//4个&来表示截取上下两段文字,中间放二维码 value = "&&&&" + value; } } //换行 if(config.getEnterFlag() == 1){ value = "\n" + value; } //空格 if(config.getEnterFlag() == 0){ value = "" + value; } text += value; } //如果换行开头,去掉这个换行 if(text.startsWith("\n")){ text = text.substring(1,text.length()); } text = text + "\n\n\n\n";//末尾4个换行 return text; } /** * 根据长度以换行切割字符串 * @param value * @param length * @return */ public static String cutTextValueByLength(String value,Integer length){ String result = ""; Integer len = value.length(); if(len <= length){ return value; } Integer i = len / length; StringBuffer str = new StringBuffer(value); for ( ;i > 0;i--) { str.insert(length * i,"\n"); } result += str; if(result.endsWith("\n")){ result = result.substring(0,result.length()-1); } return result; } public static void main(String[] args) { //生成模板信息 List configs = new ArrayList<>(); ChargerTicketConfig a = new ChargerTicketConfig(); a.setEnterFlag(0); a.setWidgetText("订单编号:"); a.setWidgetName("orderId"); a.setWidgetValue("q2394y284728入4728472"); a.setWidgetType("LABEL_INPUT"); ChargerTicketConfig b = new ChargerTicketConfig(); b.setEnterFlag(1); b.setWidgetText("车场名称:"); b.setWidgetValue("单计费还得加"); b.setWidgetType("LABEL_INPUT"); configs.add(a); configs.add(b); String ticketTemplateText = generateTemplateText(configs); System.out.println(StringUtils.isEmpty("")); } }