diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/Shell.java b/src/main/java/com/chaozhanggui/system/cashierservice/Shell.java index 12c43be..bb1fc4f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/Shell.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/Shell.java @@ -14,6 +14,7 @@ import org.springframework.context.ApplicationContext; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.RestTemplate; @@ -32,11 +33,14 @@ public class Shell { SpringApplication springApplication = new SpringApplication(Shell.class); springApplication.run(args); } + + @Bean - RestTemplate restTemplate(){ + public RestTemplate restTemplate(){ return new RestTemplate(); } + @Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return (args) -> { diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/annotation/LimitSubmit.java b/src/main/java/com/chaozhanggui/system/cashierservice/annotation/LimitSubmit.java new file mode 100644 index 0000000..e9f0e8e --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/annotation/LimitSubmit.java @@ -0,0 +1,22 @@ +package com.chaozhanggui.system.cashierservice.annotation; + +import java.lang.annotation.*; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface LimitSubmit { + String key() ; + /** + * 默认 10s + */ + int limit() default 7200; + + /** + * 请求完成后 是否一直等待 + * true则等待 + * @return + */ + boolean needAllWait() default true; +} \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/config/RedisConfiguration.java b/src/main/java/com/chaozhanggui/system/cashierservice/config/RedisConfiguration.java new file mode 100644 index 0000000..9a25563 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/config/RedisConfiguration.java @@ -0,0 +1,41 @@ +package com.chaozhanggui.system.cashierservice.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.net.UnknownHostException; + +/** + * Standard Redis configuration. + */ +@Configuration +public class RedisConfiguration { + + @Bean + //ConditionalOnMissingBean 当没有名称为redisTemplate的对象被创建时, + //才去创建redisTemplate对象 + @ConditionalOnMissingBean(name = "redisTemplate") + public RedisTemplate redisTemplate( + RedisConnectionFactory redisConnectionFactory) + throws UnknownHostException { + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(redisConnectionFactory); + return template; + } + + @Bean + @ConditionalOnMissingBean(StringRedisTemplate.class) + //StringRedisTemplate继承自RedisTemplate + public StringRedisTemplate stringRedisTemplate( + RedisConnectionFactory redisConnectionFactory) + throws UnknownHostException { + StringRedisTemplate template = new StringRedisTemplate(); + template.setConnectionFactory(redisConnectionFactory); + return template; + } + +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/DataController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/DataController.java new file mode 100644 index 0000000..f9cfc44 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/DataController.java @@ -0,0 +1,28 @@ +package com.chaozhanggui.system.cashierservice.controller; + + +import com.chaozhanggui.system.cashierservice.service.DataService; +import com.chaozhanggui.system.cashierservice.sign.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@CrossOrigin(origins = "*") +@RestController +@Slf4j +@RequestMapping("data") +public class DataController { + + @Autowired + DataService dataService; + + + @RequestMapping(value = "handoverData") + public Result handoverData(@RequestHeader("token") String token, + @RequestHeader("loginName") String loginName, + @RequestHeader("clientType") String clientType, + Integer id){ + return dataService.handoverprintData(token,id); + + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/OrderController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/OrderController.java index 1564fda..4972413 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/OrderController.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/OrderController.java @@ -129,8 +129,21 @@ public class OrderController { @RequestMapping(value = "sendMessage") public Result sendMessage(@RequestHeader("token") String token, @RequestHeader("loginName") String loginName, @RequestHeader("clientType") String clientType,@RequestParam("orderId") String orderId){ - return orderService.sendMassage(orderId); + } + + @GetMapping(value = "scanSendMessage") + public Result scanSendMessage(@RequestHeader("token") String token, @RequestHeader("loginName") String loginName, + @RequestHeader("clientType") String clientType,@RequestParam("outNumber") String outNumber,@RequestParam("shopId") String shopId){ + return orderService.scanSendMessage(outNumber,shopId); + } + + + @GetMapping(value = "getsendMessage") + public Result getsendMessage(@RequestHeader("token") String token, @RequestHeader("loginName") String loginName, + @RequestHeader("clientType") String clientType,@RequestParam("shopId") String shopId,@RequestParam("page") int page, + @RequestParam("pageSize") int pageSize){ + return orderService.getOutNumber(shopId,page,pageSize); } } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java index a830c83..72c7088 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java @@ -1,5 +1,6 @@ package com.chaozhanggui.system.cashierservice.controller; +import com.chaozhanggui.system.cashierservice.annotation.LimitSubmit; import com.chaozhanggui.system.cashierservice.entity.TbOrderDetail; import com.chaozhanggui.system.cashierservice.entity.dto.ReturnGroupOrderDto; import com.chaozhanggui.system.cashierservice.service.PayService; @@ -47,6 +48,7 @@ public class PayController { * @return */ @RequestMapping("scanpay") + @LimitSubmit(key = "scanpay:%s") public Result scanpay(HttpServletRequest request, @RequestHeader("token") String token, @RequestHeader("loginName") String loginName, @@ -69,6 +71,7 @@ public class PayController { * @return */ @GetMapping("accountPay") + @LimitSubmit(key = "accountPay:%s") public Result accountPay(@RequestHeader("token") String token, @RequestHeader("loginName") String loginName, @RequestHeader("clientType") String clientType, diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderInfoMapper.java b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderInfoMapper.java index 61454d8..7d5202e 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderInfoMapper.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderInfoMapper.java @@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; @Component @Mapper @@ -32,4 +33,13 @@ public interface TbOrderInfoMapper { @Param("day") String day, @Param("orderNo") String orderNo); TbOrderInfo selectByTradeAndMasterId(@Param("day")String day, @Param("masterId")String masterId, @Param("shopId")Integer shopId); + + TbOrderInfo selectByOutNumber(@Param("tradeDay") String tradeDay,@Param("outNumber") String outNumber,@Param("shopId") String shopId); + + + + TbOrderInfo selectByOutNumberLimit(@Param("outNumber") String outNumber,@Param("shopId") String shopId); + + + Map selectByOrderId(String orderId); } \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderOutNumberMapper.java b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderOutNumberMapper.java new file mode 100644 index 0000000..f469855 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbOrderOutNumberMapper.java @@ -0,0 +1,18 @@ +package com.chaozhanggui.system.cashierservice.dao; + +import com.chaozhanggui.system.cashierservice.entity.TbOrderOutNumber; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Mapper +public interface TbOrderOutNumberMapper { + int insert(TbOrderOutNumber record); + + int insertSelective(TbOrderOutNumber record); + + List selectAll(@Param("shopId") String shopId); +} \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderInfo.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderInfo.java index 858e94f..780b755 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderInfo.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderInfo.java @@ -98,6 +98,8 @@ public class TbOrderInfo implements Serializable { private String masterId; private List detailList; + private String outNumber; + private static final long serialVersionUID = 1L; public TbOrderInfo(){ super(); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderOutNumber.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderOutNumber.java new file mode 100644 index 0000000..07ab011 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderOutNumber.java @@ -0,0 +1,77 @@ +package com.chaozhanggui.system.cashierservice.entity; + +import java.io.Serializable; +import java.util.Date; + +public class TbOrderOutNumber implements Serializable { + private String outCode; + + private String shopId; + private String productName; + + private String productSku; + + private String status; + + private String remark; + + private Date createTime; + + private static final long serialVersionUID = 1L; + + public String getOutCode() { + return outCode; + } + + public void setOutCode(String outCode) { + this.outCode = outCode == null ? null : outCode.trim(); + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName == null ? null : productName.trim(); + } + + public String getShopId() { + return shopId; + } + + public void setShopId(String shopId) { + this.shopId = shopId; + } + + public String getProductSku() { + return productSku; + } + + public void setProductSku(String productSku) { + this.productSku = productSku == null ? null : productSku.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopUserFlow.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopUserFlow.java index d70e58c..730cd8f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopUserFlow.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopUserFlow.java @@ -19,6 +19,8 @@ public class TbShopUserFlow implements Serializable { private Date createTime; + private String type; + private static final long serialVersionUID = 1L; public Integer getId() { @@ -76,4 +78,12 @@ public class TbShopUserFlow implements Serializable { public void setCreateTime(Date createTime) { this.createTime = createTime; } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } } \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java new file mode 100644 index 0000000..886b09c --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java @@ -0,0 +1,161 @@ +package com.chaozhanggui.system.cashierservice.interceptor; + +import com.chaozhanggui.system.cashierservice.annotation.LimitSubmit; +import com.chaozhanggui.system.cashierservice.exception.MsgException; +import com.chaozhanggui.system.cashierservice.util.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Component +@Aspect +@Slf4j +public class LimitSubmitAspect { + //封装了redis操作各种方法 + @Autowired + private RedisUtils redisUtil; + + @Pointcut("@annotation(com.chaozhanggui.system.cashierservice.annotation.LimitSubmit)") + private void pay() { + } + + @Pointcut("@annotation(com.chaozhanggui.system.cashierservice.annotation.LimitSubmit)") + private void pay1() { + } + + @Around("pay()") + public Object handleSubmit(ProceedingJoinPoint joinPoint) throws Throwable { + + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + + Object[] args= joinPoint.getArgs(); + + //获取注解信息 + LimitSubmit limitSubmit = method.getAnnotation(LimitSubmit.class); + boolean needAllWait = limitSubmit.needAllWait(); + String redisKey = limitSubmit.key(); + + + int submitTimeLimiter = limitSubmit.limit(); + String key = getRedisKey(joinPoint, redisKey, String.valueOf(args[0])); + Object result = redisUtil.get(key); + log.info("开始锁定资源信息" + key); + + if (result != null) { + log.info("锁定的值是" + result.toString()); + throw new MsgException("正在处理中, 请勿重复操作"); + } + boolean setResult = redisUtil.setIfAbsent(key, String.valueOf(System.currentTimeMillis()), submitTimeLimiter); + if (!setResult) { + throw new MsgException("1正在处理中, 请勿重复操作"); + } + + + try { + Object proceed = joinPoint.proceed(); + return proceed; + } catch (Throwable e) { + log.error("Exception in {}.{}() with cause = \'{}\' and exception = \'{}\'", joinPoint.getSignature().getDeclaringTypeName(), + joinPoint.getSignature().getName(), e.getCause() != null ? e.getCause() : "NULL", e.getMessage(), e); + throw e; + } finally { + if (!needAllWait) { + redisUtil.del(redisKey); + log.info("删除后的结果: " + redisUtil.get(redisKey)); + } + } + } + + + @AfterReturning("pay1()") + public void AfterReturning(JoinPoint joinPoint) { + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + + Object[] args= joinPoint.getArgs(); + LimitSubmit limitSubmit = method.getAnnotation(LimitSubmit.class); + String redisKey = limitSubmit.key(); + String key = getRedisKey1(joinPoint, redisKey, String.valueOf(args[0])); + log.info("正常释放了锁资源" + key); + // 延时 1s 释放 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + redisUtil.del(key); + log.info("删除后的结果: " + redisUtil.get(redisKey)); + } + } + + @AfterThrowing(pointcut = "pay1()", throwing = "ex") + public void AfterThrowing(JoinPoint joinPoint, Throwable ex) { + + if (!(ex instanceof MsgException)) { + // 抛出的如果不是重复性提交的异常, 则释放锁资源 + + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + LimitSubmit limitSubmit = method.getAnnotation(LimitSubmit.class); + String redisKey = limitSubmit.key(); + Object[] args= joinPoint.getArgs(); + String key = getRedisKey1(joinPoint, redisKey, String.valueOf(args[0])); + log.info("发生异常释放了锁资源" + key); + // 延时 1s 释放 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + redisUtil.del(key); + log.info("删除后的结果: " + redisUtil.get(redisKey)); + } + } + } + + /** + * 支持多参数,从请求参数进行处理 + */ + private String getRedisKey(ProceedingJoinPoint joinPoint, String key, String orderId) { + if (key.contains("%s") && orderId != null) { + key = String.format(key, orderId); + } + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + + LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer(); + String[] parameterNames = discoverer.getParameterNames(method); + if (parameterNames != null) { + for (int i = 0; i < parameterNames.length; i++) { + String item = parameterNames[i]; + if (key.contains("#" + item)) { + key = key.replace("#" + item, joinPoint.getArgs()[i].toString()); + } + } + } + return key.toString(); + } + + private String getRedisKey1(JoinPoint joinPoint, String key, String orderId) { + if (key.contains("%s") && orderId != null) { + key = String.format(key, orderId); + } + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + + LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer(); + String[] parameterNames = discoverer.getParameterNames(method); + if (parameterNames != null) { + for (int i = 0; i < parameterNames.length; i++) { + String item = parameterNames[i]; + if (key.contains("#" + item)) { + key = key.replace("#" + item, joinPoint.getArgs()[i].toString()); + } + } + } + return key.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java index fe0ce7c..61133cb 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java @@ -30,7 +30,7 @@ public class SignInterceptor implements HandlerInterceptor { @Autowired - RedisUtil redisUtil; + RedisUtils redisUtil; @Override @@ -59,7 +59,7 @@ public class SignInterceptor implements HandlerInterceptor { String key=RedisCst.ONLINE_USER.concat(":").concat(clientType).concat(":").concat(loginName); - String cacheToken= redisUtil.getMessage(key); + String cacheToken= redisUtil.get(key)+""; if(ObjectUtil.isEmpty(cacheToken)||!cacheToken.equals(token)){ response.setContentType(CONTENT_TYPE); response.getWriter().print(JSONUtil.toJsonStr(new Result(CodeEnum.TOENNOEXIST))); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java index 7fa2aae..4e3e221 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java @@ -20,6 +20,9 @@ public class WebAppConfigurer implements WebMvcConfigurer { .excludePathPatterns("/login/login") .excludePathPatterns("/cloudPrinter/print") .excludePathPatterns("/cloudPrinter/handoverPrint") + .excludePathPatterns("/data/handoverData") + .excludePathPatterns("/order/scanSendMessage") + .excludePathPatterns("/order/getsendMessage") .excludePathPatterns("/order/sendMessage"); } } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java b/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java index 461f7a9..767b145 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java @@ -33,6 +33,8 @@ public class OrderDetailPO implements Serializable { private String remark; + private String outNumber; + @Data public static class Detail implements Serializable{ diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java index 0f90b09..8391d28 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java @@ -27,6 +27,7 @@ import java.util.Map; public class CloudPrinterService { + @Autowired TbShopUserMapper tbShopUserMapper; @Autowired private TbOrderInfoMapper tbOrderInfoMapper; @@ -192,6 +193,7 @@ public class CloudPrinterService { String data= PrinterUtils.getCashPrintData(detailPO,printType,"return"); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson,1, Integer.valueOf(printerNum), tbPrintMachineWithBLOBs.getAddress(), data); } @@ -249,6 +251,8 @@ public class CloudPrinterService { if(ObjectUtil.isNotEmpty(detailList)&&detailList.size()>0){ OrderDetailPO detailPO = new OrderDetailPO(shopInfo.getShopName(), "普通打印", orderInfo.getOrderType().equals("miniapp")?orderInfo.getTableName():orderInfo.getMasterId(), orderInfo.getOrderNo(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), "【POS-1】001", orderInfo.getOrderAmount().toPlainString(), balance,(ObjectUtil.isEmpty(orderInfo.getPayType())||ObjectUtil.isNull(orderInfo.getPayType())?"":orderInfo.getPayType() ), "0", detailList,orderInfo.getRemark()); String printType="结算单"; + + detailPO.setOutNumber(orderInfo.getOutNumber()); if(ispre){ printType="预结算单"; } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/DataService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/DataService.java new file mode 100644 index 0000000..5abdf94 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/DataService.java @@ -0,0 +1,121 @@ +package com.chaozhanggui.system.cashierservice.service; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.chaozhanggui.system.cashierservice.dao.*; +import com.chaozhanggui.system.cashierservice.entity.*; +import com.chaozhanggui.system.cashierservice.exception.MsgException; +import com.chaozhanggui.system.cashierservice.model.HandoverInfo; +import com.chaozhanggui.system.cashierservice.sign.CodeEnum; +import com.chaozhanggui.system.cashierservice.sign.Result; +import com.chaozhanggui.system.cashierservice.util.DateUtils; +import com.chaozhanggui.system.cashierservice.util.JSONUtil; +import com.chaozhanggui.system.cashierservice.util.PrinterUtils; +import com.chaozhanggui.system.cashierservice.util.TokenUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +@Slf4j +public class DataService { + + + @Autowired + private TbPrintMachineMapper tbPrintMachineMapper; + @Autowired + private TbShopInfoMapper tbShopInfoMapper; + + @Autowired + private TbmerchantAccountMapper tbmerchantAccountMapper; + + + @Autowired + private ShopUserDutyMapper shopUserDutyMapper; + + + @Autowired + private TbPlussShopStaffMapper tbPlussShopStaffMapper; + + + @Autowired + ShopUserDutyPayMapper shopUserDutyPayMapper; + + + public Result handoverprintData(String token, Integer id){ + + + JSONObject info= TokenUtil.parseParamFromToken(token); + MsgException.checkNull(info,"获取信息失败"); + + TbmerchantAccount tbmerchantAccount= tbmerchantAccountMapper.selectByPrimaryKey(Integer.valueOf(info.get("accountId").toString())); + MsgException.checkNull(tbmerchantAccount,"商户信息不存在"); + + TbShopInfo tbShopInfo= tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(tbmerchantAccount.getShopId())); + MsgException.checkNull(tbShopInfo,"店铺信息不存在"); + + + TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(tbShopInfo.getId()); + if (ObjectUtil.isEmpty(shopInfo)) { + log.error("店铺信息不存在"); + return Result.fail(CodeEnum.SHOPINFONOEXIST); + } + + + ShopUserDuty shopUserDuty=shopUserDutyMapper.selectByPrimaryKey(id); +// ShopUserDuty shopUserDuty=shopUserDutyMapper.selectByShopIdAndDay(tbShopInfo.getId(),tradeDay); + MsgException.checkNull(shopUserDuty,"交班信息不存在"); + + + TbPlussShopStaff shopStaff= tbPlussShopStaffMapper.selectByPrimaryKey(Integer.valueOf(info.get("staffId").toString())); + MsgException.checkNull(shopStaff,"员工信息不存在"); + + + List list=null; + List memberData=null; + List productCategories=null; + List> mapList= shopUserDutyPayMapper.selectByDutyId(shopUserDuty.getId()); + if(ObjectUtil.isNotEmpty(mapList)&&mapList.size()>0){ + list= JSONUtil.parseJSONStr2TList(JSONUtil.toJSONString(mapList), HandoverInfo.PayInfo.class); + } + + memberData=new ArrayList<>(); + ShopUserDutyPay shopUserDutyPay=shopUserDutyPayMapper.selectByDuctIdAndType(shopUserDuty.getId(),"deposit"); + if(ObjectUtil.isNotEmpty(shopUserDutyPay)){ + memberData.add(new HandoverInfo.MemberData(shopUserDutyPay.getAmount().toPlainString(),"会员卡消费")); + } + + memberData.add(new HandoverInfo.MemberData(ObjectUtil.isNull(shopUserDuty.getMemberInAmount())? BigDecimal.ZERO.toPlainString() : shopUserDuty.getMemberInAmount().toPlainString(),"会员卡充值")); + + + + + List> categries= shopUserDutyPayMapper.selectCetoryBydutyId(shopUserDuty.getId()); + if(ObjectUtil.isNotEmpty(categries)&&categries.size()>0){ + productCategories=JSONUtil.parseJSONStr2TList(JSONUtil.toJSONString(categries),HandoverInfo.ProductCategory.class); + } + + + HandoverInfo handoverInfo=new HandoverInfo(tbShopInfo.getShopName(), + ObjectUtil.isNotEmpty(shopUserDuty.getLoginTime())? DateUtils.getTime(shopUserDuty.getLoginTime()):null, + ObjectUtil.isNotEmpty(shopUserDuty.getLoginOutTime())?DateUtils.getTime(shopUserDuty.getLoginOutTime()):"", + ObjectUtil.isNull(shopStaff.getName())?"":shopStaff.getName(), + list,memberData,shopUserDuty.getAmount().add(ObjectUtil.isNull(shopUserDuty.getQuickAmount())?BigDecimal.ZERO:shopUserDuty.getQuickAmount()).toPlainString(), + "0", + shopUserDuty.getAmount().subtract(shopUserDuty.getReturnAmount()).toPlainString(), + shopUserDuty.getAmount().add(ObjectUtil.isNull(shopUserDuty.getQuickAmount())?BigDecimal.ZERO:shopUserDuty.getQuickAmount()).toPlainString(), + shopUserDuty.getReturnAmount().toPlainString(), + shopUserDuty.getOrderNum().toString(), + productCategories,ObjectUtil.isNull(shopUserDuty.getQuickAmount())?"0":shopUserDuty.getQuickAmount().toPlainString() + + ); + + return Result.success(CodeEnum.SUCCESS,handoverInfo); + + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/DutyService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/DutyService.java index f0bbfda..60ca448 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/DutyService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/DutyService.java @@ -47,7 +47,7 @@ public class DutyService { @Autowired private CloudPrinterService cloudPrinterService; @Autowired - private RedisUtil redisUtil; + private RedisUtils redisUtil; @Transactional(rollbackFor = Exception.class) public void exect(String message) { diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java index 8266487..7e00814 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java @@ -14,7 +14,7 @@ import com.chaozhanggui.system.cashierservice.sign.CodeEnum; import com.chaozhanggui.system.cashierservice.sign.Result; import com.chaozhanggui.system.cashierservice.util.MD5Util; import com.chaozhanggui.system.cashierservice.util.RedisCst; -import com.chaozhanggui.system.cashierservice.util.RedisUtil; +import com.chaozhanggui.system.cashierservice.util.RedisUtils; import com.chaozhanggui.system.cashierservice.util.TokenUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -46,7 +46,7 @@ public class LoginService { TbPlussShopStaffMapper tbPlussShopStaffMapper; @Autowired - RedisUtil redisUtil; + RedisUtils redisUtil; @Autowired TbTokenMapper tbTokenMapper; @@ -115,7 +115,7 @@ public class LoginService { TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(account.getShopId())); - redisUtil.saveMessage(key, token, 365 * 24 * 60 * 60); + redisUtil.set(key, token, 365 * 24 * 60 * 60); String uuid = UUID.randomUUID().toString().replaceAll("-", ""); @@ -133,7 +133,7 @@ public class LoginService { accountMap.put("shopName", shopInfo.getShopName()); } accountMap.put("uuid", uuid); - redisUtil.saveMessage("CART:UUID:" + account.getShopId().concat(account.getId().toString()), uuid); + redisUtil.set("CART:UUID:" + account.getShopId().concat(account.getId().toString()), uuid); return Result.success(CodeEnum.SUCCESS, accountMap); } @@ -143,17 +143,17 @@ public class LoginService { String key = RedisCst.ONLINE_USER.concat(":").concat(clientType).concat(":").concat(loginName); - String cacheToken = redisUtil.getMessage(key); + String cacheToken = redisUtil.get(key)+""; TbToken tbToken = tbTokenMapper.selectByToken(token); if (ObjectUtil.isEmpty(tbToken)) { - redisUtil.deleteByKey(key); + redisUtil.del(key); return Result.fail(USERNOLOGIN); } if (!"1".equals(tbToken.getStatus()) || "2".equals(tbToken.getStatus()) || "3".equals(tbToken.getStatus())) { - redisUtil.deleteByKey(key); + redisUtil.del(key); return Result.fail(USERNOLOGIN); } @@ -164,7 +164,7 @@ public class LoginService { if (!cacheToken.equals(token)) { return Result.fail(TOKENTERROR); } - redisUtil.deleteByKey(key); + redisUtil.del(key); tbToken.setStatus(status); tbToken.setUpdateTime(new Date()); tbTokenMapper.updateByPrimaryKey(tbToken); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/MemberService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/MemberService.java index 8ee778d..daaff29 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/MemberService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/MemberService.java @@ -114,8 +114,8 @@ public class MemberService { if (ObjectUtil.isNotNull(tbShopUsers) && ObjectUtil.isNotEmpty(tbShopUsers)) { TbShopUser tbShopUser = tbShopUsers.get(0); - String code = RandomUtil.randomNumbers(6); - tbShopUser.setCode(code); +// String code = RandomUtil.randomNumbers(6); +// tbShopUser.setCode(code); tbShopUser.setTelephone(phone); tbShopUser.setBirthDay(String.valueOf(map.get("birthDay"))); tbShopUser.setName(String.valueOf(map.get("nickName"))); @@ -143,7 +143,7 @@ public class MemberService { tbShopUser.setName(String.valueOf(map.get("nickName"))); tbShopUser.setSex(Byte.parseByte(String.valueOf(map.get("sex")))); tbShopUser.setLevel(Byte.parseByte(String.valueOf(map.get("level")))); - String code = RandomUtil.randomNumbers(6); + String code = RandomUtil.randomNumbers(8); tbShopUser.setCode(code); tbShopUser.setIsVip(Byte.parseByte("1")); tbShopUser.setCreatedAt(System.currentTimeMillis()); @@ -258,6 +258,7 @@ public class MemberService { TbShopUserFlow flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); + flow.setType("+"); flow.setBizCode("scanMemberIn"); flow.setBizName("会员扫码充值"); flow.setAmount(amount); @@ -311,6 +312,7 @@ public class MemberService { TbShopUserFlow flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("scanMemberIn"); + flow.setType("+"); flow.setBizName("线下充值"); flow.setAmount(amount); flow.setBalance(shopUser.getAmount()); @@ -337,6 +339,7 @@ public class MemberService { flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("scanMemberAwardIn"); + flow.setType("+"); flow.setBizName("充值活动奖励"); flow.setAmount(awardAmount); flow.setBalance(shopUser.getAmount()); @@ -421,6 +424,7 @@ public class MemberService { TbShopUserFlow flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("scanMemberIn"); + flow.setType("+"); flow.setBizName("会员扫码充值"); flow.setAmount(memberIn.getAmount()); flow.setBalance(shopUser.getAmount()); @@ -448,6 +452,7 @@ public class MemberService { TbShopUserFlow flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("scanMemberIn"); + flow.setType("+"); flow.setBizName("线下充值"); flow.setAmount(memberIn.getAmount()); flow.setBalance(shopUser.getAmount()); @@ -474,6 +479,7 @@ public class MemberService { flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("scanMemberAwardIn"); + flow.setType("+"); flow.setBizName("充值活动奖励"); flow.setAmount(awardAmount); flow.setBalance(shopUser.getAmount()); @@ -555,6 +561,7 @@ public class MemberService { TbShopUserFlow flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("cashMemberIn"); + flow.setType("+"); flow.setBizName("线下充值"); flow.setAmount(amount); flow.setBalance(shopUser.getAmount()); @@ -580,6 +587,7 @@ public class MemberService { flow = new TbShopUserFlow(); flow.setShopUserId(shopUser.getId()); flow.setBizCode("scanMemberAwardIn"); + flow.setType("+"); flow.setBizName("充值活动奖励"); flow.setAmount(awardAmount); flow.setBalance(shopUser.getAmount()); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java index c0da838..8098772 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java @@ -16,7 +16,7 @@ import com.chaozhanggui.system.cashierservice.sign.Result; import com.chaozhanggui.system.cashierservice.util.DateUtils; import com.chaozhanggui.system.cashierservice.util.HttpClientUtil; import com.chaozhanggui.system.cashierservice.util.RedisUtil; -import com.chaozhanggui.system.cashierservice.util.TokenUtil; +import com.chaozhanggui.system.cashierservice.util.RedisUtils; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; @@ -111,7 +111,7 @@ public class OrderService { if (StringUtils.isEmpty(masterId)) { boolean flag = redisUtil.exists("SHOP:CODE:" + clientType + ":" + shopId); if (flag) { - String code = redisUtil.getMessage("SHOP:CODE:" + clientType + ":" + shopId); + String code = redisUtil.getMessage("SHOP:CODE:" + clientType + ":" + shopId).toString(); Integer foodCode = Integer.valueOf(code) + 1; code = "#" + String.format("%03d", foodCode); redisUtil.saveMessage("SHOP:CODE:" + clientType + ":" + shopId, foodCode.toString()); @@ -205,7 +205,7 @@ public class OrderService { skuWithBLOBs.setUpdatedAt(System.currentTimeMillis()); tbProductSkuMapper.updateByPrimaryKey(skuWithBLOBs); - redisUtil.addSet("SHOP:CODE:SET" + clientType + ":" + shopId + ":" + DateUtils.getDay(),masterId.substring(1,masterId.length())); + redisUtil.saveMessage("SHOP:CODE:SET" + clientType + ":" + shopId + ":" + DateUtils.getDay(),masterId.substring(1,masterId.length())); return Result.success(CodeEnum.SUCCESS, masterId); } @@ -408,14 +408,14 @@ public class OrderService { } public synchronized String generateOrderCode(String day, String clientType, String shopId) { - String code = redisUtil.getMessage("SHOP:CODE:" + clientType + ":" + shopId + ":" + day); + String code = redisUtil.getMessage("SHOP:CODE:" + clientType + ":" + shopId + ":" + day)+""; // 使用顺序递增的计数器生成取餐码 String orderCode = ""; - if (StringUtils.isEmpty(code)) { + if (StringUtils.isEmpty(code)||"null".equals(code)) { orderCode = "1"; redisUtil.saveMessage("SHOP:CODE:" + clientType + ":" + shopId + ":" + day,"1"); } else { - orderCode = code; + orderCode =String.valueOf(Integer.valueOf(code)+1); } redisUtil.getIncrNum("SHOP:CODE:" + clientType + ":" + shopId + ":" + day, "2"); boolean flag = redisUtil.execsSet("SHOP:CODE:SET" + clientType + ":" + shopId + ":" + day,orderCode); @@ -430,15 +430,16 @@ public class OrderService { public Result createCode(String shopId, String clientType, String userId, String type) { String day = DateUtils.getDay(); JSONObject jsonObject = new JSONObject(); - String userCode = redisUtil.getMessage("SHOP:CODE:USER:" + clientType + ":" + shopId + ":" + day + userId); + String key="SHOP:CODE:USER:" + clientType + ":" + shopId + ":" + day + userId; + String userCode = redisUtil.getMessage(key)+""; if ("1".equals(type)) { String code = "#" + generateOrderCode(day, clientType, shopId); - redisUtil.saveMessage("SHOP:CODE:USER:" + clientType + ":" + shopId + ":" + day + userId, code); + redisUtil.saveMessage(key, code); jsonObject.put("code", code); } else { - if (StringUtils.isEmpty(userCode)) { + if (StringUtils.isEmpty(userCode)||"null".equals(userCode)||"#null".equals(userCode)) { String code = "#" + generateOrderCode(day, clientType, shopId); - redisUtil.saveMessage("SHOP:CODE:USER:" + clientType + ":" + shopId + ":" + day + userId, code); + redisUtil.saveMessage(key, code); jsonObject.put("code", code); } else { jsonObject.put("code", userCode); @@ -501,7 +502,7 @@ public class OrderService { @Transactional(rollbackFor = Exception.class) public Result cartStatus(Integer shopId, String masterId, String status, String userId, String uuid, String clientType) { - String newUuid = redisUtil.getMessage("CART:UUID:" + shopId + userId); + String newUuid = redisUtil.getMessage("CART:UUID:" + shopId + userId)+""; String day = DateUtils.getDay(); if ("true".equals(status)) { List list = cashierCartMapper.selectAllCreateOrder(masterId, shopId, day, "create", uuid); @@ -704,6 +705,8 @@ public class OrderService { return Result.success(CodeEnum.SUCCESS, pageInfo); } + @Autowired + TbShopUserMapper tbShopUserMapper; public Result orderDetail(Integer shopId, Integer id) { TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(id); if (Objects.nonNull(orderInfo)) { @@ -714,7 +717,14 @@ public class OrderService { if (StringUtils.isNotEmpty(orderInfo.getTableName())){ orderInfo.setTableId(orderInfo.getTableName()); } - orderInfo.setMemberName(""); + TbShopUser shopUser= tbShopUserMapper.selectByUserIdAndShopId(orderInfo.getMemberId(),orderInfo.getShopId()); + if(Objects.nonNull(shopUser)&&Objects.nonNull(shopUser.getName())){ + orderInfo.setMemberName(shopUser.getName()); + }else { + orderInfo.setMemberName(""); + } + + } return Result.success(CodeEnum.SUCCESS, orderInfo); } @@ -928,14 +938,114 @@ public class OrderService { return Result.success(CodeEnum.SUCCESS); } - - return Result.fail(linkedHashMap.containsKey(resObj.get("errcode")+"")?linkedHashMap.get(resObj.get("errcode")+""):"未知错误"); - - } + + @Autowired + TbOrderOutNumberMapper tbOrderOutNumberMapper; + public Result scanSendMessage(String outNumber,String shopId){ + String day = DateUtils.getDay(); + + if(ObjectUtil.isEmpty(outNumber)){ + return Result.fail(CodeEnum.OUTNUMBERNOTEXIST); + } + TbOrderOutNumber orderOutNumber=new TbOrderOutNumber(); + String outCode= day.concat("#").concat(outNumber); + + + TbOrderInfo orderInfo= tbOrderInfoMapper.selectByOutNumber(day,outNumber,shopId); + if(Objects.isNull(orderInfo)){ + orderInfo= tbOrderInfoMapper.selectByOutNumberLimit(outNumber,shopId); + if(Objects.isNull(orderInfo)){ + return Result.fail(CodeEnum.OUTNUMBERERROR); + } + } + + + TbShopInfo shopInfo= tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getShopId())); + + if(ObjectUtil.isEmpty(shopInfo)){ + return Result.fail(CodeEnum.SHOPINFONOEXIST); + } + + + TbUserInfo userInfo= tbUserInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getUserId())); + if(ObjectUtil.isEmpty(userInfo)||ObjectUtil.isEmpty(userInfo.getMiniAppOpenId())){ + return Result.fail(CodeEnum.USERNOEXIST); + } + + + + + JSONObject object= getAccessToken(); + String accessToken=object.get("access_token")+""; + + JSONObject object1=new JSONObject(); + + object1.put("template_id","z0fUG7-jhSfYCrw6poOvSRzh4_hgnPkm_5C7E5s5bCQ"); + object1.put("touser",userInfo.getMiniAppOpenId()); + + + JSONObject data=new JSONObject(); + + JSONObject tabname=new JSONObject(); + tabname.put("value",orderInfo.getOutNumber()); + + + JSONObject thing21=new JSONObject(); + thing21.put("value",shopInfo.getShopName()); + + + JSONObject thing8=new JSONObject(); + thing8.put("value","你的餐品已出餐,请及时取餐。"); + + data.put("character_string1",tabname); + data.put("thing21",thing21); + data.put("thing8",thing8); + + object1.put("data",data); + + object1.put("miniprogram_state","trial"); + object1.put("lang","zh_CN"); + + String response= HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".concat(accessToken)).body(object1.toString()).execute().body(); + log.info("返回结果:{}",response); + JSONObject resObj=JSONObject.parseObject(response); + if(ObjectUtil.isNotEmpty(resObj)&&ObjectUtil.isNotNull(resObj)&&"0".equals(resObj.get("errcode")+"")){ + + orderOutNumber.setOutCode(outCode); + Map map= tbOrderInfoMapper.selectByOrderId(orderInfo.getId().toString()); + orderOutNumber.setShopId(shopId); + orderOutNumber.setProductName(map.containsKey("product_names")?map.get("product_names").substring(0,map.get("product_names").length()-1):""); + orderOutNumber.setProductSku(map.containsKey("product_sku_name")?map.get("product_sku_name").substring(0,map.get("product_sku_name").length()-1):""); + orderOutNumber.setStatus("0"); + orderOutNumber.setRemark("成功"); + orderOutNumber.setCreateTime(new Date()); + tbOrderOutNumberMapper.insert(orderOutNumber); + return Result.success(CodeEnum.SUCCESS); + } + orderOutNumber.setOutCode(outCode); + orderOutNumber.setShopId(shopId); + Map map= tbOrderInfoMapper.selectByOrderId(orderInfo.getId().toString()); + orderOutNumber.setProductName(map.containsKey("product_names")?map.get("product_names").substring(0,map.get("product_names").length()-1):""); + orderOutNumber.setProductSku(map.containsKey("product_sku_name")?map.get("product_sku_name").substring(0,map.get("product_sku_name").length()-1):""); + orderOutNumber.setStatus("1"); + orderOutNumber.setRemark(linkedHashMap.containsKey(resObj.get("errcode")+"")?linkedHashMap.get(resObj.get("errcode")+""):"未知错误"); + orderOutNumber.setCreateTime(new Date()); + tbOrderOutNumberMapper.insert(orderOutNumber); + return Result.fail(linkedHashMap.containsKey(resObj.get("errcode")+"")?linkedHashMap.get(resObj.get("errcode")+""):"未知错误"); + } + + + public Result getOutNumber(String shopId,Integer page,Integer pageSize){ + PageHelper.startPage(page, pageSize); + List list= tbOrderOutNumberMapper.selectAll(shopId); + PageInfo pageInfo=new PageInfo(list); + return Result.success(CodeEnum.SUCCESS,pageInfo); + } + static LinkedHashMap linkedHashMap=new LinkedHashMap<>(); static { diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java index 708a2eb..31548fd 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java @@ -484,6 +484,7 @@ public class PayService { flow.setShopUserId(user.getId()); flow.setBizCode("accountPay"); flow.setBizName("会员储值卡支付"); + flow.setType("-"); flow.setAmount(orderInfo.getOrderAmount()); flow.setBalance(user.getAmount()); flow.setCreateTime(new Date()); @@ -568,6 +569,7 @@ public class PayService { TbShopUserFlow flow = new TbShopUserFlow(); flow.setShopUserId(user.getId()); flow.setBizCode("accountPay"); + flow.setType("-"); flow.setBizName("会员储值卡支付"); flow.setAmount(orderInfo.getOrderAmount()); flow.setBalance(user.getAmount()); @@ -860,6 +862,7 @@ public class PayService { flow.setShopUserId(user.getId()); flow.setBizCode("accountReturnPay"); flow.setBizName("会员储值卡退款"); + flow.setType("+"); flow.setAmount(orderInfo.getOrderAmount()); flow.setBalance(user.getAmount()); flow.setCreateTime(new Date()); @@ -1109,6 +1112,7 @@ public class PayService { flow.setShopUserId(user.getId()); flow.setBizCode("returnGroupOrder"); flow.setBizName("会员储值卡退款"); + flow.setType("+"); flow.setAmount(param.getRefundAmount()); flow.setBalance(user.getAmount()); flow.setCreateTime(new Date()); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java b/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java index f513ec3..7a77a19 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java @@ -81,6 +81,14 @@ public enum CodeEnum { + OUTNUMBERNOTEXIST("100031",false,"取餐码不允许为空","fail"), + + + OUTNUMBERERROR("100032",false,"错误的取餐码","fail"), + + + + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java index 9038c94..bfebdf3 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java @@ -147,6 +147,10 @@ public class PrinterUtils { } + if(Objects.nonNull(detailPO.getOutNumber())){ + sb.append("".concat(detailPO.getOutNumber()).concat("
")); + } + sb.append("打印时间:"+DateUtils.getTime(new Date())+"
"); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisConfig.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisConfig.java index f7146c5..71243c4 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisConfig.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisConfig.java @@ -4,12 +4,16 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; +import java.nio.charset.Charset; + /** * @ClassName RedisConfig * @Author Administrator @@ -80,4 +84,7 @@ public class RedisConfig { container.setConnectionFactory(connectionFactory); return container; } + + + } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisUtils.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisUtils.java new file mode 100644 index 0000000..58c0951 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/RedisUtils.java @@ -0,0 +1,687 @@ +package com.chaozhanggui.system.cashierservice.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Component +public class RedisUtils { + + @Value("${spring.redis.database}") + private int database; + + + @Autowired + private JedisPool pool; + + + @Autowired + private RedisTemplate redisTemplate; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + // ============================String============================= + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 递增 + * + * @param key 键 + * @param by 要增加几(大于0) + * @return + */ + public long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + * + * @param key 键 + * @param by 要减少几(小于0) + * @return + */ + public long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } + + // ================================Map================================= + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + try { + Long remove = redisTemplate.opsForList().remove(key, count, value); + return remove; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * @Description 上锁并设置过期时间 + * @Date 15:09 2023/7/7 + * @Param [key, value, time] + * @return boolean + **/ + public boolean setIfAbsent(String key, Object value, long time) { + try { + return redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + private static final int REDIS_SUCCESS = 1; + public int getIncrNum(String key, String message) { + Jedis jedis = null; + try { + // 从jedis池中获取一个jedis实例 + jedis = pool.getResource(); + if (database != 0) { + jedis.select(database); + } + if (message.equals("1")) { + jedis.decr(key); + } else { + jedis.incr(key); + } + return REDIS_SUCCESS; + + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 释放对象池,即获取jedis实例使用后要将对象还回去 + if (jedis != null) { + jedis.close(); + } + } + + return REDIS_FAILED; + } + + + private static final int REDIS_FAILED = -1; + String secKillScript = "local prodid=KEYS[1];\r\n" + + "local usernum=KEYS[2];\r\n" + + "local num= redis.call(\"get\" ,prodid);\r\n" + + "if tonumber(num)()); + String reString = String.valueOf(result); + return reString; + + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 释放对象池,即获取jedis实例使用后要将对象还回去 + // 释放对象池,即获取jedis实例使用后要将对象还回去 + if (jedis != null) { + jedis.close(); + } + } + return REDIS_FAILED+""; + } + + + /** + * 删除数据 + * @param key + * @param values + * @return + */ + public Boolean execsSet(String key,String values){ + Jedis jedis = null ; + try { + jedis = pool.getResource(); + return jedis.sismember(key,values); + }catch (Exception e) { + e.printStackTrace(); + } finally { + // 释放对象池,即获取jedis实例使用后要将对象还回去 + if (jedis != null) { + jedis.close(); + } + } + return false ; + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d71303d..1ffc75e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -42,6 +42,9 @@ thirdPay: payType: fushangtong callBack: https://cashierclient.sxczgkj.cn/cashier-client/notify/notifyPay url: https://paymentapi.sxczgkj.cn +wx: + appId: wxd88fffa983758a30 + secrete: a34a61adc0602118b49400baa8812454 diff --git a/src/main/resources/generator-mapper/generatorConfig.xml b/src/main/resources/generator-mapper/generatorConfig.xml index 067c195..5e2caa9 100644 --- a/src/main/resources/generator-mapper/generatorConfig.xml +++ b/src/main/resources/generator-mapper/generatorConfig.xml @@ -52,7 +52,7 @@ -
diff --git a/src/main/resources/mapper/TbOrderInfoMapper.xml b/src/main/resources/mapper/TbOrderInfoMapper.xml index 55e6184..a24346d 100644 --- a/src/main/resources/mapper/TbOrderInfoMapper.xml +++ b/src/main/resources/mapper/TbOrderInfoMapper.xml @@ -46,6 +46,9 @@ + + + id, order_no, settlement_amount, pack_fee, origin_amount, product_amount, amount, @@ -53,7 +56,7 @@ discount_amount, table_id, small_change, send_type, order_type, product_type, status, billing_id, merchant_id, shop_id, is_vip, member_id, user_id, product_score, deduct_score, user_coupon_id, user_coupon_amount, refund_able, paid_time, is_effect, is_group, - updated_at, `system_time`, created_at, is_accepted, pay_order_no,trade_day,`source`,remark,master_id,`table_name` + updated_at, `system_time`, created_at, is_accepted, pay_order_no,trade_day,`source`,remark,master_id,`table_name`,out_number + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/TbOrderOutNumberMapper.xml b/src/main/resources/mapper/TbOrderOutNumberMapper.xml new file mode 100644 index 0000000..11963cc --- /dev/null +++ b/src/main/resources/mapper/TbOrderOutNumberMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + insert into tb_order_out_number (out_code,shop_id, product_name, product_sku, + status, remark, create_time + ) + values (#{outCode,jdbcType=VARCHAR},#{shopId,jdbcType=VARCHAR} ,#{productName,jdbcType=VARCHAR}, #{productSku,jdbcType=VARCHAR}, + #{status,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP} + ) + + + insert into tb_order_out_number + + + out_code, + + + product_name, + + + product_sku, + + + status, + + + remark, + + + create_time, + + + + + #{outCode,jdbcType=VARCHAR}, + + + #{productName,jdbcType=VARCHAR}, + + + #{productSku,jdbcType=VARCHAR}, + + + #{status,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/TbShopUserFlowMapper.xml b/src/main/resources/mapper/TbShopUserFlowMapper.xml index 9c9e34a..e359ea3 100644 --- a/src/main/resources/mapper/TbShopUserFlowMapper.xml +++ b/src/main/resources/mapper/TbShopUserFlowMapper.xml @@ -9,12 +9,13 @@ + - id, shop_user_id, amount, balance, biz_code, biz_name, create_time + id, shop_user_id, amount, balance, biz_code, biz_name, create_time, type + SELECT - f.*, - u.`name` + f.*, + u.`name` FROM - tb_shop_user_flow f - LEFT JOIN tb_shop_user u ON f.shop_user_id = u.id + tb_shop_user_flow f + LEFT JOIN tb_shop_user u ON f.shop_user_id = u.id where 1=1 and u.id = #{memberId} order by f.id desc - + + \ No newline at end of file