1
0
Quellcode durchsuchen

收银端相关代码

zcb vor 4 Jahren
Ursprung
Commit
37270c636d
24 geänderte Dateien mit 865 neuen und 170 gelöschten Zeilen
  1. 3 3
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  2. 78 3
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  3. 1 1
      kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java
  4. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderEntity.java
  5. 13 1
      kmall-admin/src/main/java/com/kmall/admin/entity/PickUpCodeEntity.java
  6. 6 0
      kmall-admin/src/main/java/com/kmall/admin/fromcomm/controller/SysLoginController.java
  7. 2 3
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java
  8. 4 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java
  9. 10 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderWXPayRecordService.java
  10. 2 2
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  11. 259 19
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  12. 30 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderWXPayRecordServiceImpl.java
  13. 1 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/PickUpCodeServiceImpl.java
  14. 23 10
      kmall-admin/src/main/java/com/kmall/admin/task/TestTask.java
  15. 50 20
      kmall-admin/src/main/java/com/kmall/admin/websocket/WebSocketServer.java
  16. 41 41
      kmall-admin/src/main/resources/conf/fastdfs.properties
  17. 1 1
      kmall-admin/src/main/resources/logback.xml
  18. 5 5
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  19. 1 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  20. 11 11
      kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml
  21. 15 9
      kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml
  22. 3 1
      kmall-admin/src/main/resources/mybatis/mapper/UserDao.xml
  23. 38 23
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  24. 258 17
      kmall-admin/src/main/webapp/js/sale/sale.js

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -283,9 +283,9 @@ public class GoodsController {
         return R.ok().put("goods", goods);
     }
 
-    @RequestMapping("/details/{prodBarcode}")
+    @RequestMapping("/details/{prodBarcode}/{storeId}")
 //    @RequiresPermissions("goods:details") http://127.0.0.1:8080/goods/details/11111
-    public R details(@PathVariable("prodBarcode")String prodBarcode) {
+    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId) {
         SysUserEntity user = ShiroUtils.getUserEntity();
         if(user == null) {
             return R.error("用户登录超时,请重新登录");
@@ -293,7 +293,7 @@ public class GoodsController {
         if (!user.getRoleType().equalsIgnoreCase("2")) {
             return R.error("该操作只允许店员账户操作");
         }
-        GoodsDetailsDto goods = goodsService.queryGoodsDetailsByProdBarcode(prodBarcode);
+        GoodsDetailsDto goods = goodsService.queryGoodsDetailsByProdBarcode(prodBarcode,storeId);
         if(goods == null) {
             return R.error("商品信息不存在");
         }

+ 78 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -39,9 +39,12 @@ import javax.servlet.http.HttpServletResponse;
 import javax.websocket.server.PathParam;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 /**
@@ -293,6 +296,14 @@ public class OrderController {
         return R.ok().put("ticket", ticket);
     }
 
+    @RequestMapping("/printMsgAndChangeCode")
+    public R printMsgAndChangeCode(@RequestBody Map param) {
+        Integer id = (Integer) param.get("id");
+        String sessionId = (String) param.get("sessionId");
+        Ticket ticket = orderService.printMsg(id.longValue(),sessionId);
+        return R.ok().put("ticket", ticket);
+    }
+
     @RequestMapping("/printCode")
     public R printMsg(){
 
@@ -853,16 +864,51 @@ public class OrderController {
     }
 
 
-
+    /**
+     * 收银端支付
+     * @param param
+     * @return
+     * @throws IOException
+     */
     @RequestMapping("/orderConfirm")
     public R orderConfirm(@RequestBody Map param) throws IOException {
 
         SysUserEntity user = ShiroUtils.getUserEntity();
-        Map resultObj = orderService.offlineRetailSubmit(param,user);
+        Map resultObj = null;
+        try {
+//            throw new RuntimeException("系统异常");
+            resultObj = orderService.offlineRetailSubmit(param,user);
+            return R.ok().put("resultObj", resultObj);
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+
+        }
+
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping("/orderRefund")
+    public R orderRefund( @RequestBody Map param) {
+        Integer orderId = (Integer) param.get("orderId");
+        OrderEntity orderInfo = orderService.queryObject(orderId.longValue());
 
-        return R.ok().put("resultObj", resultObj);
+        String sessionId = (String) param.get("sessionId");
+
+        try {
+            orderService.orderRefund(orderInfo,sessionId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return R.ok();
     }
 
+
     @RequestMapping("/orderDetail/{orderSn}")
     public R orderDetail(@PathVariable("orderSn") String orderSn) throws IOException {
 
@@ -872,11 +918,40 @@ public class OrderController {
         map.put("orderId",orderEntity.getId());
         List<OrderGoodsEntity> goodsList = orderGoodsService.queryList(map);
 
+        BigDecimal tax = new BigDecimal(0);
+        for(OrderGoodsEntity orderGoodsEntity : goodsList){
+            BigDecimal retailPrice = orderGoodsEntity.getRetailPrice();
+            BigDecimal goodsRate = orderGoodsEntity.getGoodsRate();
+            Integer number = orderGoodsEntity.getNumber();
+            BigDecimal goodsTax = retailPrice.multiply(goodsRate).multiply(new BigDecimal(number));
+            tax = tax.add(goodsTax);
+        }
+
         Map<String,Object> result = new HashMap<>();
         result.put("orderProcessRecordEntity",orderProcessRecordEntity);
         result.put("orderEntity",orderEntity);
         result.put("goodsList",goodsList);
+        result.put("tax",tax.setScale(2, RoundingMode.HALF_DOWN).toString());
 
         return R.ok().put("resultObj", result);
     }
+
+    @RequestMapping("/getIdCardInfo")
+    public R getIdCardInfo() throws IOException {
+
+        Map map = new HashMap();
+        String ssl = OkHttpUtils.post(map,"http://qhdswl.f3322.net:56800/api/limit/get", "SSL");
+        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
+        Matcher matcher = pattern.matcher(ssl);
+        char ch;
+        while (matcher.find()) {
+            ch = (char) Integer.parseInt(matcher.group(2), 16);
+            ssl = ssl.replace(matcher.group(1), ch + "");
+        }
+
+        return R.ok().put("info",ssl);
+
+    }
+
+
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -24,7 +24,7 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
 
     GoodsEntity queryObjectByProdBarcodeAndStore(@Param("prodBarcode")String prodBarcode, @Param("storeId")Integer storeId);
 
-    GoodsDetailsDto queryGoodsDetailsByProdBarcode(@Param("prodBarcode")String prodBarcode);
+    GoodsDetailsDto queryGoodsDetailsByProdBarcode(@Param("prodBarcode") String prodBarcode, @Param("storeId")String storeId);
 
     List<GoodsEntity> querySame(Map<String, Object> map);
 

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderEntity.java

@@ -133,6 +133,8 @@ public class OrderEntity implements Serializable {
 
     private String orderSnWx;
 
+    private String AliTradeNo;
+
     private String isMergePay;
     //商品名称
     private String goodsName;
@@ -1085,4 +1087,12 @@ public class OrderEntity implements Serializable {
     public void setOrderProcessRecord(OrderProcessRecordEntity orderProcessRecord) {
         this.orderProcessRecord = orderProcessRecord;
     }
+
+    public String getAliTradeNo() {
+        return AliTradeNo;
+    }
+
+    public void setAliTradeNo(String aliTradeNo) {
+        AliTradeNo = aliTradeNo;
+    }
 }

+ 13 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/PickUpCodeEntity.java

@@ -27,7 +27,7 @@ public class PickUpCodeEntity implements Serializable {
      */
     private String merchOrderSn;
     /**
-     * 取货码状态,0:未取,1:已取
+     * 取货码状态,0:未取,1:已取,2:可取
      */
     private String pickUpCodeStatus;
     /**
@@ -39,6 +39,10 @@ public class PickUpCodeEntity implements Serializable {
      */
     private String pickUpCodeVerificationtime;
     /**
+     * 门店id
+     */
+    private String storeId;
+    /**
      * 创建时间,yyyy-MM-dd HH:mm:ss
      */
     private Date createTime;
@@ -185,4 +189,12 @@ public class PickUpCodeEntity implements Serializable {
     public Date getTstm() {
         return tstm;
     }
+
+    public String getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(String storeId) {
+        this.storeId = storeId;
+    }
 }

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/fromcomm/controller/SysLoginController.java

@@ -9,6 +9,8 @@ import com.kmall.manager.manager.redis.JedisUtil;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.crypto.hash.Sha256Hash;
 import org.apache.shiro.subject.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -38,6 +40,8 @@ public class SysLoginController {
     private Producer producer;
     public static int wsTokenExpireTime = 3600 * 24 * 30;
 
+    private final Logger LOGGER = LoggerFactory.getLogger(SysLoginController.class);
+
     @RequestMapping("captcha.jpg")
     public void captcha(HttpServletResponse response, HttpSession session) throws ServletException, IOException {
         response.setHeader("Cache-Control", "no-store, no-cache");
@@ -50,6 +54,7 @@ public class SysLoginController {
         //保存到shiro session
         JedisUtil.set(Constants.KAPTCHA_SESSION_KEY, text, wsTokenExpireTime);
 
+        LOGGER.info("生成验证码:"+text);
         ServletOutputStream out = response.getOutputStream();
         ImageIO.write(image, "jpg", out);
     }
@@ -62,6 +67,7 @@ public class SysLoginController {
     @RequestMapping(value = "/sys/login", method = RequestMethod.POST)
     public R login(String username, String password, String captcha,HttpSession session) throws IOException {
         String kaptcha = (String) JedisUtil.get(Constants.KAPTCHA_SESSION_KEY);
+        LOGGER.info("获取验证码:"+kaptcha);
         System.out.println(kaptcha);
         JedisUtil.del(Constants.KAPTCHA_SESSION_KEY);
         if (!captcha.equalsIgnoreCase(kaptcha)) {

+ 2 - 3
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -3,8 +3,6 @@ package com.kmall.admin.service;
 import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.entity.GoodsEntity;
-import com.kmall.common.utils.R;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
@@ -128,7 +126,8 @@ public interface GoodsService {
     /**
      * 条形码查询商品详情
      * @param prodBarcode 条形码
+     * @param storeId
      * @return
      */
-    GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode);
+    GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode, String storeId);
 }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java

@@ -58,6 +58,8 @@ public interface OrderService {
      */
     Ticket printMsg(Long id);
 
+    Ticket printMsg(Long id,String sessionId);
+
     /**
      * 退款
      */
@@ -139,4 +141,6 @@ public interface OrderService {
     Map offlineRetailSubmit(Map param, SysUserEntity user);
 
     OrderEntity queryObjectByOrderSn(String orderSn);
+
+    void orderRefund(OrderEntity orderInfo, String sessionId) throws Exception;
 }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderWXPayRecordService.java

@@ -5,6 +5,7 @@ import com.kmall.admin.entity.OrderWXPayRecordEntity;
 import com.kmall.api.entity.OrderVo;
 import com.kmall.common.utils.wechat.WechatMicropayApiResult;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 
 import java.util.List;
 
@@ -65,4 +66,13 @@ public interface OrderWXPayRecordService {
     int updateWXPayRecordTradeState(Integer id, WechatRefundApiResult wechatRefundApiResult);
 
     OrderWXPayRecordEntity saveRecordVo(OrderVo order);
+
+    /**
+     * 根据支付宝返回的信息修改支付记录
+     *
+     * @param id                      支付记录id
+     * @param aliPayMicropayApiResult 微信返回的信息
+     * @return 0为成功
+     */
+    int updateRecordByAli(Integer id, AliPayMicropayApiResult aliPayMicropayApiResult);
 }

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -1020,8 +1020,8 @@ public class GoodsServiceImpl implements GoodsService {
     }
 
     @Override
-    public GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode) {
-        return goodsDao.queryGoodsDetailsByProdBarcode(prodBarcode);
+    public GoodsDetailsDto queryGoodsDetailsByProdBarcode(String prodBarcode, String storeId) {
+        return goodsDao.queryGoodsDetailsByProdBarcode(prodBarcode,storeId);
     }
 /*  @Override
     @Transactional

+ 259 - 19
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -5,7 +5,6 @@ import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.Maps;
 import com.kmall.admin.dao.*;
 import com.kmall.admin.dao.mk.store.MkStorePromOrderRealDao;
-import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.dto.OrderExpressDto;
 import com.kmall.admin.dto.OrderRecognitionDto;
 import com.kmall.admin.entity.*;
@@ -14,13 +13,13 @@ import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
 import com.kmall.admin.fromcomm.dao.SysConfigDao;
 import com.kmall.admin.service.*;
 import com.kmall.admin.websocket.WebSocketServer;
-import com.kmall.api.dto.CampMinusDto;
 import com.kmall.api.entity.*;
-import com.kmall.api.entity.mk.MkStoreCampMinusVo;
-import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
 import com.kmall.common.utils.ResponseData;
 import com.kmall.common.utils.wechat.WechatMicropayApiResult;
 import com.kmall.common.utils.wechat.WechatReverseApiResult;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+import com.kmall.manager.manager.alipay.AliPayRequestParams;
+import com.kmall.manager.manager.alipay.AliPayUtil;
 import com.kmall.manager.manager.express.sf.properties.SFPropertiesBuilder;
 import com.kmall.manager.manager.express.sf.properties.SFUtil;
 import com.kmall.manager.manager.express.sf.entity.SfRouteServiceResponseEntity;
@@ -39,10 +38,13 @@ import com.kmall.common.utils.*;
 import com.kmall.common.utils.print.ticket.item.*;
 import com.kmall.manager.manager.express.kdn.KdniaoUtil;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -51,6 +53,10 @@ import java.util.*;
 
 @Service("orderService")
 public class OrderServiceImpl implements OrderService {
+
+
+    private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);
+
     @Autowired
     private OrderDao orderDao;
     @Autowired
@@ -101,6 +107,8 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private PickUpCodeService pickUpCodeService;
 
+
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -234,6 +242,9 @@ public class OrderServiceImpl implements OrderService {
     @Override
     public Ticket printMsg(Long id) {
         OrderEntity orderEntity = queryInfos(id);
+
+
+
         List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
         // 获取门店
         StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
@@ -286,6 +297,82 @@ public class OrderServiceImpl implements OrderService {
         cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
         cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
 
+
+
+
+
+        return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
+    }
+
+    @Override
+    public Ticket printMsg(Long id, String sessionId) {
+        OrderEntity orderEntity = queryInfos(id);
+
+
+
+        List<OrderGoodsEntity> orderGoodsEntityList = orderEntity.getOrderGoodsEntityList();
+        // 获取门店
+        StoreEntity storeEntity = storeDao.queryObject(orderEntity.getStoreId());
+        // 获取清关信息
+        OrderProcessRecordEntity orderProcessRecordEntity =
+                orderProcessRecordDao.queryObjectByOrderSn(orderEntity.getOrderSn());
+
+        // 小票头
+        TicketHead head = new TicketHead();
+        head.setTitle(OmsMerchPropertiesBuilder.instance().getMerchName() + storeEntity.getStoreName());
+        //        head.setMemberId(orderEntity.getUserName().toString());
+        head.setOrderId(orderEntity.getOrderSn());
+        head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(new Date()));
+
+        // 商品信息
+        Integer goodsTotal = 0; // 商品总个数
+        BigDecimal total = Constant.ZERO; // 商品总计
+        List<Goods> goodsList = new ArrayList<>();
+        for (OrderGoodsEntity orderGoods : orderGoodsEntityList) {
+            goodsTotal += orderGoods.getNumber();
+            total = total.add(orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber())))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            Goods goods = new Goods(orderGoods.getGoodsName(), orderGoods.getRetailPrice().toString(),
+                    orderGoods.getNumber().toString(),
+                    orderGoods.getRetailPrice().multiply(new BigDecimal(orderGoods.getNumber()))
+                            .setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+            goodsList.add(goods);
+        }
+
+        // 收银信息
+        CashInfo cashInfo = new CashInfo();
+        cashInfo.setGoodsTotal(goodsTotal.toString());
+        cashInfo.setTotal(total.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setReceipts(orderEntity.getActualPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setOddChange("0.00");
+        cashInfo.setCoupon(orderEntity.getCouponPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setFreight(
+                new BigDecimal(orderEntity.getFreightPrice()).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
+        cashInfo.setPaymentMode("微信支付");
+
+        // 海关清单
+        CusListing cusListing = new CusListing();
+        cusListing.setOrderId(orderEntity.getOrderSn());
+        if (!orderEntity.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())) {
+            cusListing.setWaybillId(orderProcessRecordEntity.getLogisticsNo());
+            cusListing.setInvtNo(orderProcessRecordEntity.getInvtNo());
+            cusListing.setConsignee(orderEntity.getConsignee());
+            cusListing.setConsigneeTel(orderEntity.getMobile());
+        }
+        cusListing.setOriginAddress(PrintTicketPropertiesBuilder.instance().getAddress());
+        cusListing.setDeliveryAddress(storeEntity.getStoreAddress());
+        // 尝试在取货码表中查询数据,如果有的话就改变状态
+        String orderSn = orderEntity.getOrderSn();
+        PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(orderSn);
+        if(pickUpCodeEntity != null){
+            pickUpCodeEntity.setPickUpCodeStatus("1");
+            pickUpCodeService.update(pickUpCodeEntity);
+//            try {
+//                WebSocketServer.delete(sessionId,orderEntity.getStoreId(),pickUpCodeEntity);
+//            } catch (IOException e) {
+//                e.printStackTrace();
+//            }
+        }
         return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing);
     }
 
@@ -341,6 +428,7 @@ public class OrderServiceImpl implements OrderService {
         }
         // 更新库存
         updateStock(order, "管理后台订单退款");*/
+//        updateStock(order, "管理后台订单退款");
 
         queryStorePromRealUpdateIsScan(order);
     }
@@ -1003,7 +1091,7 @@ public class OrderServiceImpl implements OrderService {
         BigDecimal goodsTotalPrice = new BigDecimal(0.00);
         for (LinkedHashMap goods : goodsList) {
             goodsTotalPrice = goodsTotalPrice
-                    .add(new BigDecimal((Double) goods.get("retailPrice")).multiply(new BigDecimal((Integer) goods.get("sellVolume"))));
+                    .add(new BigDecimal( goods.get("retailPrice").toString()).multiply(new BigDecimal( goods.get("sellVolume").toString())));
         }
         //订单价格计算:订单的总价+运费
         BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice);
@@ -1174,8 +1262,12 @@ public class OrderServiceImpl implements OrderService {
         orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
         orderEntity.setPayFlag(payFlag);
         orderEntity.setPayTime(new Date());
-        if(orderSnWx != null){
-            orderEntity.setOrderSnWx(orderSnWx);
+        if(Dict.payFlag.item_alipay.getItem().equalsIgnoreCase(payFlag)){
+            orderEntity.setAliTradeNo(orderSnWx);
+        }else {
+            if (orderSnWx != null) {
+                orderEntity.setOrderSnWx(orderSnWx);
+            }
         }
         orderDao.update(orderEntity);
         return 0;
@@ -1398,6 +1490,7 @@ public class OrderServiceImpl implements OrderService {
      * @return
      */
     @Override
+    @Transactional
     public Map offlineRetailSubmit(Map param, SysUserEntity user) {
         // 解析订单数据 List
         List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
@@ -1439,8 +1532,7 @@ public class OrderServiceImpl implements OrderService {
                     return resultObj;
                 }
                 Integer sellVolume = (Integer)goodsDto.get("sellVolume");
-                goodsEntity.setGoodsNumber(sellVolume);
-                goodsEntities.add(goodsEntity);
+
                 goodsDto.put("goodsId",goodsEntity.getId());
                 goodsDto.put("goodsSn",goodsEntity.getGoodsSn());
                 goodsDto.put("productId",goodsEntity.getProductId());
@@ -1460,13 +1552,15 @@ public class OrderServiceImpl implements OrderService {
                         productInfo.setStockNum(productInfo.getStockNum() - sellVolume);
                         productInfo.setStoreId(Long.valueOf(storeId));
                         productInfo.addSellVolume();
-//                        productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
+                        productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
 
                         if(goodsEntity != null) {
-                            goodsEntity.setStockNum((Integer.parseInt(goodsEntity.getStockNum()) - sellVolume)+"");
-//                            goodsDao.update(goodsEntity);
+                            goodsEntity.setGoodsNumber(goodsEntity.getGoodsNumber() - sellVolume);
+                            goodsDao.update(goodsEntity);
                         }
                     }
+                    goodsEntity.setGoodsNumber(sellVolume);
+                    goodsEntities.add(goodsEntity);
                 }
             }
 
@@ -1481,6 +1575,7 @@ public class OrderServiceImpl implements OrderService {
                 userEntity.setGender(1);
                 userEntity.setRegisterTime(new Date());
                 userEntity.setLastLoginTime(new Date());
+                userEntity.setIdNo((String) userInfo.get("customIDCard"));
                 userDao.save(userEntity);
             }
 
@@ -1492,7 +1587,7 @@ public class OrderServiceImpl implements OrderService {
             order.setStore_id(storeId.longValue());
             order.setMerchOrderSn(merchOrderSn);
 
-            //开启事务,插入订单信息和订单商品
+            //插入订单信息和订单商品
             orderDao.saveOrderVo(order);
 
             // TODO 订单流转表
@@ -1534,9 +1629,9 @@ public class OrderServiceImpl implements OrderService {
 
 
             // 微信支付
-            wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
+//            wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
             // 支付宝支付
-//            AliPay();
+            AliPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
 
             // 保存订单流转表
             // 设置下单完成时间
@@ -1560,8 +1655,8 @@ public class OrderServiceImpl implements OrderService {
         } catch (Exception e) {
             e.printStackTrace();
             resultObj.put("errno", 400);
-            resultObj.put("errmsg", "订单异常");
-            return resultObj;
+            resultObj.put("errmsg", "订单异常------"+e.getMessage());
+            throw new RuntimeException(e);
         }
 
 
@@ -1570,6 +1665,106 @@ public class OrderServiceImpl implements OrderService {
         return resultObj;
     }
 
+    private void AliPay(SysUserEntity user, String parCode, Map resultObj, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws Exception {
+
+        AliPayRequestParams params = new AliPayRequestParams();
+        params.setAuthCode(parCode);
+        params.setBody(order.getApprovalRemark());
+        params.setOutTradeNo(order.getOrder_sn());
+        params.setSubject("CW下单");
+        params.setStoreId(store.getId()+"");
+        params.setTotalAmount(order.getActual_price().setScale(2,BigDecimal.ROUND_HALF_UP)+"");
+        LOGGER.info("调用阿里支付接口的请求参数:"+JacksonUtils.toJson(params));
+        AliPayMicropayApiResult aliPayMicropayApiResult = AliPayUtil.aliTradePay(params);
+        orderWXPayRecordService.updateRecordByAli(orderWXPayRecordCurrent.getId(), aliPayMicropayApiResult);
+        LOGGER.info("调用阿里支付接口的同步返回结果:"+JacksonUtils.toJson(aliPayMicropayApiResult));
+        resultObj.put("shopName",store.getStoreName()); // 根据门店编号查询
+        resultObj.put("userName",user.getUsername());
+
+
+        // 修改订单状态
+        //当支付成功时,修改订单,并把其他支付记录撤销
+        if (AliPayUtil.AliPayTradeState.SUCC.getCode().equals(aliPayMicropayApiResult.getCode())) {
+//            //查询当前订单所有的支付记录
+//            List<OrderWXPayRecordEntity> orderWXPayRecordEntitys =
+//                    orderWXPayRecordService.getRecordsByOutTradeNo(order.getOrder_sn());
+            this.confirmPay(order.getId(), Dict.payFlag.item_alipay.getItem(), aliPayMicropayApiResult.getTradeNo());
+            // 设置支付单完成时间
+            processRecordEntity.setPaymentSuccTime(aliPayMicropayApiResult.getGmtPayment());
+            processRecordEntity.setPayTransactionId(aliPayMicropayApiResult.getTradeNo());
+
+        // 系统繁忙
+        } else if(AliPayUtil.AliPayTradeState.SERVER_FAIL.getCode().equals(aliPayMicropayApiResult.getCode())){
+            LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+            throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请稍后再试");
+
+        // 支付失败
+        }else if(AliPayUtil.AliPayTradeState.BUSINESS_FAIL.getCode().equals(aliPayMicropayApiResult.getCode())){
+            // 系统异常
+            if(AliPayUtil.BusinessFailState.SYSTEM_ERROR.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请稍后再试");
+            // 订单总额超过限额
+            }else if(AliPayUtil.BusinessFailState.TOTAL_FEE_EXCEED.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请告知顾客");
+            // 授权码无效
+            }else if(AliPayUtil.BusinessFailState.PAYMENT_AUTH_CODE_INVALID.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请顾客刷新条码后,重新支付");
+            // 交易信息被篡改
+            }else if(AliPayUtil.BusinessFailState.CONTEXT_INCONSISTENT.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
+            // 余额支付功能关闭
+            }else if(AliPayUtil.BusinessFailState.ERROR_BALANCE_PAYMENT_DISABLE.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户打开余额支付");
+            // 交易买家不匹配
+            }else if(AliPayUtil.BusinessFailState.TRADE_BUYER_NOT_MATCH.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
+            // 买家状态非法
+            }else if(AliPayUtil.BusinessFailState.BUYER_ENABLE_STATUS_FORBID.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家联系支付宝小二,确认为什么非法");
+            // 唤起移动收银台失败
+            }else if(AliPayUtil.BusinessFailState.PULL_MOBILE_CASHIER_FAIL.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户刷新条码后,重新支付");
+            // 用户的无限支付开关关闭
+            }else if(AliPayUtil.BusinessFailState.MOBILE_PAYMENT_SWITCH_OFF.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请用户在PC上打开无线支付开关后,在发起支付");
+            // 支付失败
+            }else if(AliPayUtil.BusinessFailState.PAYMENT_FAIL.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请重试");
+            // 商户账号被冻结
+            }else if(AliPayUtil.BusinessFailState.SELLER_BEEN_BLOCKED.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请联系支付宝小二解冻");
+            // 买家未通过人行认证
+            }else if(AliPayUtil.BusinessFailState.ERROR_BUYER_CERTIFY_LEVEL_LIMIT.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家联系支付宝小二");
+            // 用户当面付付款开关管壁
+            }else if(AliPayUtil.BusinessFailState.USER_FACE_PAYMENT_SWITCH_OFF.getCode().equalsIgnoreCase(aliPayMicropayApiResult.getSubCode())){
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+",请买家打开当面付付款开关");
+            }else{
+                LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+                throw new RuntimeException(aliPayMicropayApiResult.getSubMsg());
+            }
+        // 其他支付异常状态
+        } else {
+            LOGGER.info(aliPayMicropayApiResult.getSubMsg());
+            throw new RuntimeException(aliPayMicropayApiResult.getSubMsg()+"...........请联系管理员");
+        }
+
+
+    }
+
     private void wxPay(SysUserEntity user, String parCode, Map resultObj, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws ParseException {
         R r;
         WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
@@ -1649,6 +1844,50 @@ public class OrderServiceImpl implements OrderService {
         return orderDao.queryObjectByOrderSn(orderSn);
     }
 
+    @Override
+    public void orderRefund(OrderEntity order, String sessionId) throws Exception {
+        boolean needUpdateStock = true;
+        if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
+            order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
+        }
+        if (Dict.payFlag.item_cash.getItem().equals(order.getPayFlag())) {
+            order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
+        }else{
+
+            AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getMerchOrderSn(), "38.81",
+                    "用户退款", order.getStoreId() + "");
+
+            LOGGER.info(userRefund.getSubMsg());
+            order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
+            OrderRefundEntity orderRefund = new OrderRefundEntity();
+            orderRefund.setRefundId(userRefund.getTradeNo());
+            orderRefund.setOutRefundNo(userRefund.getOutTradeNo());
+            orderRefund
+                    .setRefundMoney(new BigDecimal(userRefund.getRefundFee()));
+            orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款成功
+            orderRefund.setModTime(new Date());
+
+                orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
+                orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
+                orderRefund.setCreateTime(new Date());
+                List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
+                if(list.size()>1){//多条订单
+                    orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
+                }else{
+                    orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
+                }
+                orderRefundDao.save(orderRefund);//退款记录
+        }
+        orderDao.update(order);//修改为退款成功
+        // 修改取货码
+        PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
+        pickUpCodeEntity.setPickUpCodeStatus("3");
+        pickUpCodeService.update(pickUpCodeEntity);
+//        WebSocketServer.delete(sessionId,order.getStoreId(),pickUpCodeEntity);
+        updateStock(order, "收银端退款");
+
+    }
+
 
     /**
      * 设置订单数据
@@ -1660,8 +1899,9 @@ public class OrderServiceImpl implements OrderService {
         BigDecimal goodsTotalPrice = new BigDecimal(0.00);
         BigDecimal freightPrice = Constant.ZERO;
         for (LinkedHashMap goods : goodsList) {
+
             goodsTotalPrice = goodsTotalPrice
-                    .add(new BigDecimal((Double) goods.get("retailPrice")).multiply(new BigDecimal((Integer) goods.get("sellVolume"))));
+                    .add(new BigDecimal(goods.get("retailPrice").toString()).multiply(new BigDecimal(goods.get("sellVolume").toString())));
         }
 
 
@@ -1709,7 +1949,7 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setOrder_price(orderTotalPrice);
         orderInfo.setActual_price(actualPrice);
         orderInfo.setOrder_type("1");
-        orderInfo.setOrder_status(201);
+        orderInfo.setOrder_status(0);
         orderInfo.setShipping_status(0);
         orderInfo.setPay_status(0);
         orderInfo.setShipping_id(0L);

+ 30 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderWXPayRecordServiceImpl.java

@@ -4,6 +4,7 @@ import com.kmall.admin.dao.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.service.OrderWXPayRecordService;
 import com.kmall.api.entity.OrderVo;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 import com.kmall.manager.manager.wechat.WechatUtil;
 import com.kmall.common.utils.Constant;
 import com.kmall.common.utils.RRException;
@@ -132,4 +133,33 @@ public class OrderWXPayRecordServiceImpl
         orderWXPayRecordDao.save(orderWXPayRecord);
         return orderWXPayRecord;
     }
+
+    /**
+     * 根据支付宝返回的信息修改支付记录
+     *
+     * @param id                      支付记录id
+     * @param aliPayMicropayApiResult 微信返回的信息
+     * @return 0为成功
+     */
+    @Override
+    public int updateRecordByAli(Integer id, AliPayMicropayApiResult aliPayMicropayApiResult) {
+        OrderWXPayRecordEntity orderWXPayRecord = new OrderWXPayRecordEntity();
+        orderWXPayRecord.setId(id);
+        orderWXPayRecord.setTradeState(aliPayMicropayApiResult.getTradeState());
+        if(WechatUtil.WXTradeState.SUCCESS.getCode().equals(orderWXPayRecord.getTradeState())){
+            orderWXPayRecord.setResultCode(orderWXPayRecord.getTradeState());
+            orderWXPayRecord.setErrCode("");
+            orderWXPayRecord.setErrCodeDes("");
+//            orderWXPayRecord.setOpenid(aliPayMicropayApiResult.getOpenid());
+//            orderWXPayRecord.setIsSubscribe(aliPayMicropayApiResult.getIs_subscribe());
+            orderWXPayRecord.setTradeType("MICROPAY"); // TODO 先写死,后期改
+            orderWXPayRecord.setFeeType("CNY"); // TODO 先写死,后期修改
+            orderWXPayRecord.setTotalFee(aliPayMicropayApiResult.getReceiptAmount());
+//            orderWXPayRecord.setTransactionId(aliPayMicropayApiResult.getTradeNo()); // TODO  支付宝流水号 可能长度不够
+//            orderWXPayRecord.setAttach(aliPayMicropayApiResult.getAttach());
+        }
+        orderWXPayRecord.setModTime(new Date());
+        orderWXPayRecordDao.update(orderWXPayRecord);
+        return 0;
+    }
 }

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/PickUpCodeServiceImpl.java

@@ -55,6 +55,7 @@ public class PickUpCodeServiceImpl implements PickUpCodeService {
             pickUpCode.setPickUpCodeCreatetime(df.format(new Date()));// new Date()为获取当前系统时间
         }
         pickUpCode.setModerSn(ShiroUtils.getUserEntity().getUserId().toString());
+        pickUpCode.setStoreId(ShiroUtils.getUserEntity().getStoreId().toString());
         pickUpCode.setCreateTime(new Date());
         pickUpCode.setModTime(new Date());
 

+ 23 - 10
kmall-admin/src/main/java/com/kmall/admin/task/TestTask.java

@@ -1,13 +1,24 @@
 package com.kmall.admin.task;
 
+import com.kmall.admin.entity.PickUpCodeEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.fromcomm.service.SysUserService;
+import com.kmall.admin.service.PickUpCodeService;
+import com.kmall.admin.websocket.WebSocketServer;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 测试定时任务(演示Demo,可删除)
  * <p>
@@ -17,24 +28,26 @@ import org.springframework.stereotype.Component;
  * @email
  * @date 2016年11月30日 下午1:34:24
  */
-//@Component("testTask")
+@Component("testTask")
+@EnableScheduling
 public class TestTask {
     private Logger logger = LoggerFactory.getLogger(getClass());
 
     @Autowired
     private SysUserService sysUserService;
+    @Autowired
+    private static PickUpCodeService pickUpCodeService;
+
+
 
-    public void test(String params) {
-        logger.info("我是带参数的test方法,正在被执行,参数为:" + params);
+    @Scheduled(cron = "0/5 * * * * ?")
+    public void flushPickUpCode() {
+        logger.info("flushPickUpCode-----------------" );
 
-        try {
-            Thread.sleep(1000L);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
 
-        SysUserEntity user = sysUserService.queryObject(1L);
-        System.out.println(ToStringBuilder.reflectionToString(user));
+        WebSocketServer.broadcastInfo("broadcast");
+//        SysUserEntity user = sysUserService.queryObject(1L);
+//        System.out.println(ToStringBuilder.reflectionToString(user));
 
     }
 

+ 50 - 20
kmall-admin/src/main/java/com/kmall/admin/websocket/WebSocketServer.java

@@ -37,10 +37,13 @@ public class WebSocketServer {
     private static CopyOnWriteArraySet<Session> SessionSet ;
     // 存放取货码,key是收银员编号
     private static Map<String, List<PickUpCodeEntity>> pickUpCodeMap ;
+
+    private static List<PickUpCodeEntity> pickUpList ;
     static {
         // concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。
         SessionSet = new CopyOnWriteArraySet<Session>();
         pickUpCodeMap = new HashMap<>();
+        pickUpList = new ArrayList<>();
     }
 
 
@@ -52,19 +55,34 @@ public class WebSocketServer {
     public void setOptionService(PickUpCodeService pickUpCodeService) {
         WebSocketServer.pickUpCodeService = pickUpCodeService;
     }
+
+    public static void delete(String sessionId, Integer storeId, PickUpCodeEntity pickUpCodeEntity) throws IOException {
+//        List<PickUpCodeEntity> pickUpCodeEntities = pickUpCodeMap.get(storeId+"");
+//        for(PickUpCodeEntity pick : pickUpList){
+//            if(pick.getPickUpCodeSn().equalsIgnoreCase(pickUpCodeEntity.getPickUpCodeSn())){
+//                pickUpList.remove(pick);
+//            }
+//        }
+
+        sendMessage(sessionId,"delete",storeId+"");
+
+    }
+
     /**
      * 连接建立成功调用的方法
      */
     @OnOpen
     public void onOpen(Session session,@PathParam(value="param")String param ) {
         List<PickUpCodeEntity> pickUpCodeEntities = pickUpCodeMap.get(param);
-        if(pickUpCodeEntities == null){
+        // TODO
+//        if(pickUpCodeEntities == null){
             // 查询所有的取货码
-            Map<String,Object> dataParam = new HashMap<>();
-            dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
-            pickUpCodeEntities = pickUpCodeService.queryList(dataParam);
-            pickUpCodeMap.put(param,pickUpCodeEntities);
-        }
+        Map<String,Object> dataParam = new HashMap<>();
+        dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+//        dataParam.put("pickUpCodeStatus","0");
+        pickUpList = pickUpCodeService.queryList(dataParam);
+        pickUpCodeMap.put(param,pickUpList);
+//        }
         SessionSet.add(session);
         logger.info("WebSocket连接请求 session id:{}", session.getId());
         // 在线数加1
@@ -120,28 +138,39 @@ public class WebSocketServer {
 
     public static void sendMessage(Session session, String message,String picNo) {
         try {
-            List<PickUpCodeEntity> pickUpCodeEntities = new ArrayList<>();
-            if(picNo != null){
-                pickUpCodeEntities = pickUpCodeMap.get(picNo);
-            }
+//            List<PickUpCodeEntity> pickUpCodeEntities = new ArrayList<>();
+            logger.info(picNo);
+//            if(picNo != null){
+//                pickUpCodeEntities = pickUpCodeMap.get(picNo);
+//            }
             Map<String,Object> data = new HashMap<>();
             if("服务端返回WebSocket连接成功".equalsIgnoreCase(message)){
 
-
-
                 data.put("sessionId",session.getId());
-                data.put("pickUpCodeList",pickUpCodeEntities);
+                data.put("pickUpCodeList",pickUpList);
 
                 String info = JSONObject.toJSONString(data);
                 session.getBasicRemote().sendText(info);
+                logger.info("发送条形码给前端,内容:" + info);
             }else{
-                // 根据订单id查询条形码,返回给前端页面
-                PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(message);
-                pickUpCodeEntities.add(pickUpCodeEntity);
-                data.put("pickUpCodeList",pickUpCodeEntities);
-                String info = JSONObject.toJSONString(data);
-                session.getBasicRemote().sendText(info);
-                logger.info("发送条形码给前端,内容:"+info);
+                if("broadcast".equalsIgnoreCase(message)){
+                    Map<String,Object> dataParam = new HashMap<>();
+                    dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+                    List<PickUpCodeEntity> pickUpList = pickUpCodeService.queryList(dataParam);
+                    data.put("pickUpCodeList", pickUpList);
+                    String info = JSONObject.toJSONString(data);
+                    session.getBasicRemote().sendText(info);
+                    logger.info("发送条形码给前端,内容:" + info);
+                }else {
+                    // 根据订单id查询条形码,返回给前端页面
+                    PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(message);
+                    pickUpList.add(pickUpCodeEntity);
+
+                    data.put("pickUpCodeList", pickUpList);
+                    String info = JSONObject.toJSONString(data);
+                    session.getBasicRemote().sendText(info);
+                    logger.info("发送条形码给前端,内容:" + info);
+                }
             }
 
 
@@ -186,6 +215,7 @@ public class WebSocketServer {
         }
         if (session != null) {
             sendMessage(session, message,storeId);
+            logger.info("sessionId:"+session.getId());
         } else {
             logger.warn("没有找到你指定ID的会话:{}", sessionId);
         }

+ 41 - 41
kmall-admin/src/main/resources/conf/fastdfs.properties

@@ -1,43 +1,7 @@
-##\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
-connect_timeout=30
-
-#\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
-network_timeout=60
-
-#\u6587\u4EF6\u8DEF\u5F84
-base_path=/data/files/
-
-#tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
-#Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-tracker_server=192.168.1.251:22122
-
-log_level=info
-
-use_connection_pool = false
-
-connection_pool_max_idle_time = 3600
-
-load_fdfs_parameters_from_tracker=false
-
-use_storage_id = false
-
-storage_ids_filename = storage_ids.conf
-
-#HTTP \u670D\u52A1\u5668\u5730\u5740
-http.tracket_nginx_addr=192.168.1.251
-
-#HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
-http.tracker_server_port=80
-
-#\u6587\u4EF6\u4F5C\u8005
-file.author=kmall-pt
-
-
-#############\u751F\u4EA7\u73AF\u5883################
 ###\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
-##connect_timeout=30
-##
-###\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
+#connect_timeout=30
+#
+##\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
 #network_timeout=60
 #
 ##\u6587\u4EF6\u8DEF\u5F84
@@ -45,7 +9,7 @@ file.author=kmall-pt
 #
 ##tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
 ##Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-#tracker_server=120.76.26.84:22122
+#tracker_server=192.168.1.251:22122
 #
 #log_level=info
 #
@@ -60,10 +24,46 @@ file.author=kmall-pt
 #storage_ids_filename = storage_ids.conf
 #
 ##HTTP \u670D\u52A1\u5668\u5730\u5740
-#http.tracket_nginx_addr=120.76.26.84
+#http.tracket_nginx_addr=192.168.1.251
 #
 ##HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
 #http.tracker_server_port=80
 #
 ##\u6587\u4EF6\u4F5C\u8005
 #file.author=kmall-pt
+
+
+#############\u751F\u4EA7\u73AF\u5883################
+##\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
+#connect_timeout=30
+#
+##\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
+network_timeout=60
+
+#\u6587\u4EF6\u8DEF\u5F84
+base_path=/data/files/
+
+#tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
+#Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
+tracker_server=120.76.26.84:22122
+
+log_level=info
+
+use_connection_pool = false
+
+connection_pool_max_idle_time = 3600
+
+load_fdfs_parameters_from_tracker=false
+
+use_storage_id = false
+
+storage_ids_filename = storage_ids.conf
+
+#HTTP \u670D\u52A1\u5668\u5730\u5740
+http.tracket_nginx_addr=120.76.26.84
+
+#HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
+http.tracker_server_port=80
+
+#\u6587\u4EF6\u4F5C\u8005
+file.author=kmall-pt

+ 1 - 1
kmall-admin/src/main/resources/logback.xml

@@ -6,7 +6,7 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
-    <property name="LOG_HOME" value="/data/project/logs/kmall-pt/kmall-admin/"/>
+    <property name="LOG_HOME" value="/data/project/logs/kmall-cw/kmall-admin/"/>
     <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />

+ 5 - 5
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -201,7 +201,7 @@
 
     <select id="queryObjectByProdBarcodeAndStore" resultType="com.kmall.admin.entity.GoodsEntity">
          SELECT
-            a.id,a.sku,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId'
+            a.id,a.sku,a.goods_number,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId',a.goods_rate as goodsRate
         FROM
             mall_goods a
         LEFT JOIN mall_product_store_rela r ON r.goods_id = a.id
@@ -224,13 +224,13 @@
     </select>
 
     <select id="queryGoodsDetailsByProdBarcode" resultType="com.kmall.admin.dto.GoodsDetailsDto">
-        SELECT
-        a.goods_sn as GoodsSn,a.retail_price as retailPrice,a.prod_barcode as prodBarcode,a.name,a.brand,a.goods_desc as goodsDesc,a.goods_unit as goodsUnit,a.goods_rate as goodsRate,a.primary_pic_url ,r.value as specification
+        SELECT distinct
+        a.goods_sn as GoodsSn,m.retail_price as retailPrice,a.prod_barcode as prodBarcode,a.name,a.brand,a.goods_desc as goodsDesc,a.goods_unit as goodsUnit,a.goods_rate as goodsRate,a.primary_pic_url ,r.value as specification
         FROM
             mall_goods a
         LEFT JOIN mall_goods_specification r ON r.goods_id = a.id
-
-        where a.prod_barcode = #{prodBarcode}
+        left join mall_product_store_rela m on m.goods_id = a.id and r.goods_id = m.goods_id
+        where a.prod_barcode = #{prodBarcode} and m.store_id = #{storeId}
     </select>
 
 

+ 1 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -783,6 +783,7 @@
             <if test="campMinusId != null">`camp_minus_id` = #{campMinusId},</if>
             <if test="campName != null">`camp_name` = #{campName},</if>
             <if test="callbackStatus != null">`callback_status` = #{callbackStatus},</if>
+            <if test="AliTradeNo != null">`ali_trade_no` = #{AliTradeNo},</if>
             <if test="orderType != null">`order_type` = #{orderType},</if>
             <if test="storeId != null">`store_id` = #{storeId},</if>
             <if test="payFlag != null">`pay_flag` = #{payFlag},</if>

+ 11 - 11
kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml

@@ -30,7 +30,7 @@
         <result property="shipmentSuccTime" column="shipment_succ_time"/>
         <result property="processContent" column="process_content"/>
         <result property="tstm" column="tstm"/>
-		<result property="payTransactionId" column="pay_transaction_id"/>
+		<result property="payTransactionId" column="ali_trade_no"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.OrderProcessRecordEntity">
@@ -61,7 +61,7 @@
 			`shipment_succ_time`,
 			`process_content`,
 			r.`tstm`,
-			o.pay_transaction_id
+			o.ali_trade_no
 		from mall_order_process_record r inner join mall_order o on r.order_sn = o.order_sn
 		where id = #{id}
 	</select>
@@ -94,7 +94,7 @@
 		`shipment_succ_time`,
 		`process_content`,
 		r.`tstm`,
-		o.pay_transaction_id
+		o.ali_trade_no as pay_transaction_id
 		from mall_order_process_record r inner join mall_order o on r.order_sn = o.order_sn
 		where r.order_sn = #{orderSn}
 	</select>
@@ -144,7 +144,7 @@
 			limit #{offset}, #{limit}
 		</if>
 	</select>
-	
+
  	<select id="queryTotal" resultType="int">
 		select count(*) from mall_order_process_record
 		WHERE 1=1
@@ -152,7 +152,7 @@
             AND name LIKE concat('%',#{name},'%')
         </if>
 	</select>
-	 
+
 	<insert id="save" parameterType="com.kmall.admin.entity.OrderProcessRecordEntity" useGeneratedKeys="true" keyProperty="id">
 		insert into mall_order_process_record(
 			`order_sn`,
@@ -207,9 +207,9 @@
 			#{processContent},
 			#{tstm})
 	</insert>
-	 
+
 	<update id="update" parameterType="com.kmall.admin.entity.OrderProcessRecordEntity">
-		update mall_order_process_record 
+		update mall_order_process_record
 		<set>
 			<if test="orderSn != null">`order_sn` = #{orderSn}, </if>
 			<if test="userId != null">`user_id` = #{userId}, </if>
@@ -239,16 +239,16 @@
 		</set>
 		where id = #{id}
 	</update>
-	
+
 	<delete id="delete">
 		delete from mall_order_process_record where id = #{value}
 	</delete>
-	
+
 	<delete id="deleteBatch">
-		delete from mall_order_process_record where id in 
+		delete from mall_order_process_record where id in
 		<foreach item="id" collection="array" open="(" separator="," close=")">
 			#{id}
 		</foreach>
 	</delete>
 
-</mapper>
+</mapper>

+ 15 - 9
kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml

@@ -10,6 +10,7 @@
         <result property="pickUpCodeStatus" column="pick_up_code_status"/>
         <result property="pickUpCodeCreatetime" column="pick_up_code_createtime"/>
         <result property="pickUpCodeVerificationtime" column="pick_up_code_verificationtime"/>
+		<result property="storeId" column="store_id"/>
         <result property="createTime" column="create_time"/>
         <result property="moderSn" column="moder_sn"/>
         <result property="modTime" column="mod_time"/>
@@ -24,6 +25,7 @@
 			`pick_up_code_status`,
 			`pick_up_code_createtime`,
 			`pick_up_code_verificationtime`,
+			`store_id`,
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
@@ -47,6 +49,7 @@
     		`pick_up_code_status`,
     		`pick_up_code_createtime`,
     		`pick_up_code_verificationtime`,
+    		`store_id`,
     		`create_time`,
     		`moder_sn`,
     		`mod_time`,
@@ -67,14 +70,14 @@
                 order by ${sidx} ${order}
             </when>
 			<otherwise>
-                order by order_sn desc
+                order by pick_up_code_createtime desc
 			</otherwise>
         </choose>
 		<if test="offset != null and limit != null">
 			limit #{offset}, #{limit}
 		</if>
 	</select>
-	
+
  	<select id="queryTotal" resultType="int">
 		select count(*) from mall_pick_up_code
 		WHERE 1=1
@@ -82,7 +85,7 @@
             AND `order_sn` LIKE concat('%',#{orderSn},'%')
         </if>
 	</select>
-	 
+
 	<insert id="save" parameterType="com.kmall.admin.entity.PickUpCodeEntity">
 		insert into mall_pick_up_code(
 			`order_sn`,
@@ -91,6 +94,7 @@
 			`pick_up_code_status`,
 			`pick_up_code_createtime`,
 			`pick_up_code_verificationtime`,
+			`store_id`,
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
@@ -102,20 +106,22 @@
 			#{pickUpCodeStatus},
 			#{pickUpCodeCreatetime},
 			#{pickUpCodeVerificationtime},
+			#{storeId},
 			#{createTime},
 			#{moderSn},
 			#{modTime},
 			#{tstm})
 	</insert>
-	 
+
 	<update id="update" parameterType="com.kmall.admin.entity.PickUpCodeEntity">
-		update mall_pick_up_code 
+		update mall_pick_up_code
 		<set>
 			<if test="pickUpCodeSn != null">`pick_up_code_sn` = #{pickUpCodeSn}, </if>
 			<if test="merchOrderSn != null">`merch_order_sn` = #{merchOrderSn}, </if>
 			<if test="pickUpCodeStatus != null">`pick_up_code_status` = #{pickUpCodeStatus}, </if>
 			<if test="pickUpCodeCreatetime != null">`pick_up_code_createtime` = #{pickUpCodeCreatetime}, </if>
 			<if test="pickUpCodeVerificationtime != null">`pick_up_code_verificationtime` = #{pickUpCodeVerificationtime}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
 			<if test="modTime != null">`mod_time` = #{modTime}, </if>
@@ -123,16 +129,16 @@
 		</set>
 		where order_sn = #{orderSn}
 	</update>
-	
+
 	<delete id="delete">
 		delete from mall_pick_up_code where order_sn = #{orderSn}
 	</delete>
-	
+
 	<delete id="deleteBatch">
-		delete from mall_pick_up_code where order_sn in 
+		delete from mall_pick_up_code where order_sn in
 		<foreach item="orderSn" collection="array" open="(" separator="," close=")">
 			#{orderSn}
 		</foreach>
 	</delete>
 
-</mapper>
+</mapper>

+ 3 - 1
kmall-admin/src/main/resources/mybatis/mapper/UserDao.xml

@@ -18,7 +18,7 @@
         <result property="registerIp" column="register_ip"/>
         <result property="avatar" column="avatar"/>
         <result property="weixinOpenid" column="weixin_openid"/>
-        <result property="id" column="id_no"/>
+        <result property="idNo" column="id_no"/>
         <result property="lastFaceTime" column="last_face_time"/>
     </resultMap>
 
@@ -95,6 +95,7 @@
 		insert into mall_user(
 			`username`,
 			`password`,
+			`id_no`,
 			`gender`,
 			`birthday`,
 			`register_time`,
@@ -110,6 +111,7 @@
 		values(
 			#{username},
 			#{password},
+			#{idNo},
 			#{gender},
 			#{birthday},
 			#{registerTime},

+ 38 - 23
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -19,9 +19,9 @@
         <Row :gutter="16">
             <ul class="nav navbar-top-links navbar-right">
                 <li >
-                    <span>&nbsp; 门店:深圳Xxxxxx店</span>
+                    <span>&nbsp; 门店:{{storeName}}</span>
                 </li>
-                <li><span><i class="fa fa-user-circle" ></i> &nbsp;收银员:张三</span></li>
+                <li><span><i class="fa fa-user-circle" ></i> &nbsp;收银员:{{sysUserInfo.username}}</span></li>
                 <li><a @click="logout"><i class="fa fa fa-sign-out"></i> 退出</a></li>
             </ul>
         </Row>
@@ -44,7 +44,7 @@
                             <span style="margin: 8px;">商品描述: {{goods.goodsDesc}}</span>
                         </div>
                         <div v-show="!goodsDetail">
-                            请扫描商品
+                            <h3 style="text-align: center">请扫描商品</h3>
                         </div>
                     </li>
                 </ul>
@@ -78,7 +78,7 @@
                         </table>
 
                     </li>
-                    <li  style="height: 300px;">
+                    <!--<li  style="height: 300px;">
                         <table id="general" class="table .table-striped">
                             <tr style="border: white;background-color: orange">
                                 <th>一般贸易</th>
@@ -89,11 +89,11 @@
                             </tr>
 
                         </table>
-                    </li>
+                    </li>-->
 
                     <li  style="height: 100px;">
                         <i-button type="warning" @click="clearGoodsList"><i class="fa fa-pencil-square-o"></i>&nbsp;清空商品列表</i-button>
-                        <i-button data-toggle="modal" data-target="#myModal" type="warning" ><i class="fa fa-pencil-square-o"></i>&nbsp;提交订单</i-button>
+                        <i-button data-toggle="modal" @click="toOrderSubmit" type="warning" ><i class="fa fa-pencil-square-o"></i>&nbsp;提交订单</i-button>
 
                         <div class="modal fade" id="myModal"  role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                             <div class="modal-dialog">
@@ -106,11 +106,11 @@
                                         <form>
                                             <div class="form-group">
                                                 <label for="customName" class="control-label">姓名:</label>
-                                                <input type="text" class="form-control" ref="customName" id="customName">
+                                                <input type="text" class="form-control" v-bind:value="customname" ref="customName"  id="customName">
                                             </div>
                                             <div class="form-group">
                                                 <label for="customIDCard" class="control-label">身份证:</label>
-                                                <input type="text" class="form-control" ref="customIDCard" id="customIDCard" />
+                                                <input type="text" class="form-control" v-bind:value="customidcard" ref="customIDCard"  id="customIDCard" />
                                             </div>
                                             <div class="form-group">
                                                 <label for="customPhone" class="control-label">手机号:</label>
@@ -120,6 +120,7 @@
                                     </div>
                                     <div class="modal-footer">
                                         <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                                        <button type="button" class="btn btn-primary" @click="getIDCardInfo" id="IDCard">读取身份证信息</button>
                                         <button type="button" class="btn btn-primary" @click="submitCustomInfo" id="Send">去付款</button>
                                     </div>
                                 </div>
@@ -153,10 +154,12 @@
                 </ul>
             </div>
             <div class="col-md-3">
-                <h2 class="text-center">取码</h2>
+                <h2 class="text-center">取码</h2>
                 <div class="row" >
                     <div class="col-xs-4 col-sm-4" v-for="(item,i) in pickUpCodeList" style="margin-bottom: 8px;">
-                        <i-button data-toggle="modal" data-target="#orderDetail" type="warning" @click="queryOrderDetail(item.orderSn)" ><i class="fa fa-pencil-square-o"></i>&nbsp;{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" type="warning" @click="queryOrderDetail(item.orderSn)" v-if="item.pickUpCodeStatus == 0" ><i class="fa fa-pencil-square-o"></i>&nbsp;{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" type="info" @click="queryOrderDetail(item.orderSn)" v-if="item.pickUpCodeStatus == 1" ><i class="fa fa-pencil-square-o"></i>&nbsp;{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" type="success" @click="queryOrderDetail(item.orderSn)" v-if="item.pickUpCodeStatus == 2" ><i class="fa fa-pencil-square-o"></i>&nbsp;{{item.pickUpCodeSn}}</i-button>
                     </div>
                 </div>
             </div>
@@ -173,32 +176,44 @@
                                 <div class="row" style="border:0">
                                     <div class="col-md-3" id="orderNo">订单编号: {{orderEntity.orderSn}}</div>
                                     <div class="col-md-3" id="serialNumber">支付流水号: <span>{{orderProcessRecord.payTransactionId}}</span></div>
-                                    <div class="col-md-3" id="waybillNo">运单编号: </div>
-                                    <div class="col-md-3" id="inventoryNo">清单编号: </div>
+                                    <div class="col-md-3" id="waybillNo">运单编号: {{orderProcessRecord.logisticsNo}}</div>
+                                    <div class="col-md-3" id="inventoryNo">清单编号: {{orderProcessRecord.invtNo}}</div>
                                 </div>
                                 <div class="row" style="border:0">
-                                    <div class="col-md-3" id="orderDeclarationTime">订单申报时间: </div>
-                                    <div class="col-md-3" id="payDeclarationTime">支付单申报时间: </div>
-                                    <div class="col-md-3" id="waybillDeclarationTime">运单申报时间: </div>
-                                    <div class="col-md-3" id="inventoryDeclarationTime">清单放行时间: </div>
+                                    <div class="col-md-3" id="orderDeclarationTime">订单申报时间: {{orderProcessRecord.eleOrderStartTime}}</div>
+                                    <div class="col-md-3" id="payDeclarationTime">支付单申报时间: {{orderProcessRecord.paymentStartTime}}</div>
+                                    <div class="col-md-3" id="waybillDeclarationTime">运单申报时间: {{orderProcessRecord.waybillStartTime}}</div>
+                                    <div class="col-md-3" id="inventoryDeclarationTime">清单放行时间: {{orderProcessRecord.customsSuccTime}}</div>
                                 </div>
                             <div class="row" style="border:0">
-                                <div class="col-md-3" id="orderSubmitTime">订单提交时间: </div>
+                                <div class="col-md-3" id="orderSubmitTime">订单提交时间: {{orderProcessRecord.addOrderStartTime}}</div>
                                 <div class="col-md-3" id="payStatus">支付状态:
                                     <span v-if="orderEntity.payStatus == 0">未付款</span>
                                     <span v-if="orderEntity.payStatus == 1">付款中</span>
                                     <span v-if="orderEntity.payStatus == 2">已付款</span>
                                 </div>
-                                <div class="col-md-3" id="inventoryStatus">清关状态: </div>
+                                <div class="col-md-3" id="inventoryStatus">清关状态:
+                                    <span v-if="orderProcessRecord.isCustomsSend == 0">失败</span>
+                                    <span v-if="orderProcessRecord.isCustomsSend == 1">成功</span>
+                                    <span v-if="orderProcessRecord.isCustomsSend == 2">清关中</span>
+                                </div>
                             </div>
                             <div class="row" style="border:0">
-                                <div class="col-md-3" id="orderDeclareStatus">订单申报状态: </div>
-                                <div class="col-md-3" id="payOrderDeclareStatus">支付单申报状态: </div>
+                                <div class="col-md-3" id="orderDeclareStatus">订单申报状态:
+                                    <span v-if="orderProcessRecord.isEleOrderSend == 0">失败</span>
+                                    <span v-if="orderProcessRecord.isEleOrderSend == 1">成功</span>
+                                    <span v-if="orderProcessRecord.isEleOrderSend == 2">申报中</span>
+                                </div>
+                                <div class="col-md-3" id="payOrderDeclareStatus">支付单申报状态:
+                                    <span v-if="orderProcessRecord.isPaymentSend == 0">失败</span>
+                                    <span v-if="orderProcessRecord.isPaymentSend == 1">成功</span>
+                                    <span v-if="orderProcessRecord.isPaymentSend == 2">申报中</span>
+                                </div>
                             </div>
                             <div class="row" style="border:0">
                                 <div class="col-md-3" id="orderTotal">订单总额: {{orderEntity.actualPrice}}</div>
-                                <div class="col-md-3" id="orderTaxes">订单税费: </div>
-                                <div class="col-md-3" id="invetoryReceipt">清关回执: </div>
+                                <div class="col-md-3" id="orderTaxes">订单税费: {{tax}}</div>
+                                <div class="col-md-3" id="invetoryReceipt">清关回执: <!--{{orderProcessRecord.eleOrderStartTime}}--></div>
                             </div>
                             <table id="goodsDetailTable" class="table .table-striped" style="margin-top: 50px;">
                                 <tr style="border: white;background-color: orange">
@@ -222,7 +237,7 @@
                         <div class="modal-footer">
                             <button type="button" class="btn btn-primary" @click="verification" id="verification" data-dismiss="modal">核销</button>
                             <button type="button" class="btn btn-primary" @click="refundOrder" id="refundOrder" data-dismiss="modal">退款</button>
-                            <button type="button" class="btn btn-primary" @click="retrySendOrder" id="retrySendOrder" data-dismiss="modal">订单重推</button>
+                            <!--<button type="button" class="btn btn-primary" @click="retrySendOrder" id="retrySendOrder" data-dismiss="modal">订单重推</button>-->
                         </div>
                     </div>
                 </div><!-- /.modal -->

+ 258 - 17
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -1,6 +1,7 @@
 $(function () {
 
     openWebSocket();
+    queryAssistantInfo();
 });
 
 
@@ -16,13 +17,19 @@ let vm = new Vue({
         goodsList:[],
         orderInfo:[],
         userInfo:{},
+        sysUserInfo:{},
+        storeName:null,
         prodBarcode:null,
         sessionId:null,
         pickUpCodeList:[],
         goodsDetailList:[],
         orderEntity:{},
         orderProcessRecord:{},
+        tax:0,
         currentOrderNo:null,
+        customname:'',
+        customidcard:'',
+        storeId:null,
         index:0,
         max:0,
         ruleValidate: {
@@ -37,8 +44,10 @@ let vm = new Vue({
     methods: {
         query: function () {
 
+            vm.storeId = sessionStorage.getItem("storeId");;
+
             var thisGoods = {};
-            $.get("../goods/details/"+vm.prodBarcode, function (r) {
+            $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId, function (r) {
                 if (r.code == 0) {
 
                     vm.goodsDetail = true;
@@ -47,7 +56,7 @@ let vm = new Vue({
                     thisGoods.retailPrice = r.goodsDetails.retailPrice;
                     thisGoods.specification = r.goodsDetails.specification;
                     thisGoods.prodBarcode = r.goodsDetails.prodBarcode;
-                    thisGoods.goodsDesc = r.goodsDetails.goodsDesc;
+                   //  thisGoods.goodsDesc = r.goodsDetails.goodsDesc;
                     thisGoods.sellVolume = 1;
 
                     if(!vm.goodsList[vm.index]){
@@ -89,14 +98,20 @@ let vm = new Vue({
         },
         clearGoodsList:function(){
             this.goodsList = [];
+
+
+        },
+        toOrderSubmit:function(){
+
+            if(this.goodsList.length == 0){
+                alert("请选择商品");
+                return;
+            }
+            $('#myModal').modal('show')
         },
         submitOrder:function(){
             $('#payCode').unbind('keydown').keydown(function(event){});
-            $(".form-group input[type=text]").each(function(){
-                this.value = '';
-            })
-            var saler = "张三";
-            var saleNo = "001";
+
 
             var param = {'userInfo':vm.userInfo,'payCode':this.$refs.payCode.currentValue,'goodsList':vm.goodsList,'sessionId':vm.sessionId};
             this.$refs.payCode.currentValue = '';
@@ -106,13 +121,18 @@ let vm = new Vue({
                 contentType: "application/json",
                 data: JSON.stringify(param),
                 success: function (r) {
+                    console.log(r);
                     if (r.code == 0) {
                         if (r.resultObj != null) {
-
+                            $(".form-group input[type=text]").each(function(){
+                                this.value = '';
+                            })
                             // 打印取货码小票
                             var content = getPrintContent(r.resultObj);
                             printArea(content);
                             vm.goodsList = [];
+                            vm.customname = '' ;
+                            vm.customidcard = '';
                             // alert('打印小票完成');
                         }else{
                             // alert("打印小票失败");
@@ -124,10 +144,32 @@ let vm = new Vue({
             });
 
         },
+        getIDCardInfo: function(){
+            console.log(1);
+            $.get("../order/getIdCardInfo", function (r){
+                if(r.code === 0){
+                    var data = JSON.parse(r.info);
+                    vm.customname = data.rows[0].data.name;
+                    vm.customidcard = data.rows[0].data.id_no;
+                }
+            });
+
+        },
         submitCustomInfo:function(){
-            this.userInfo.customName = this.$refs.customName.value;
-            this.userInfo.customIDCard = this.$refs.customIDCard.value;
+            this.userInfo.customName = vm.customname == ''  ? this.$refs.customName.value :vm.customname;
+            this.userInfo.customIDCard = vm.customidcard == ''  ? this.$refs.customIDCard.value :vm.customidcard;
             this.userInfo.customPhone = this.$refs.customPhone.value;
+            debugger
+            var idcardReg = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
+            if(!idcardReg.test(this.userInfo.customIDCard)){
+                alert("请输入正确的身份证号");
+                return ;
+            }
+
+            if(!(/^1[3456789]\d{9}$/.test(this.userInfo.customPhone))){
+                alert("手机号码有误,请重填");
+                return ;
+            }
 
 
 
@@ -150,27 +192,52 @@ let vm = new Vue({
 
         },
         queryOrderDetail:function(orderSn){
+            var storeId = sessionStorage.getItem("storeId");;
             $.get("../order/orderDetail/"+orderSn, function (r) {
                 if (r.code == 0) {
                     vm.orderProcessRecord = r.resultObj.orderProcessRecordEntity;
                     vm.orderEntity = r.resultObj.orderEntity;
                     vm.goodsDetailList = r.resultObj.goodsList;
                     vm.currentOrderNo = r.resultObj.orderEntity.id;
+                    vm.tax = r.resultObj.tax;
+
+                    if(vm.orderProcessRecord.eleOrderStartTime){
+                        vm.orderProcessRecord.eleOrderStartTime = parsedate(vm.orderProcessRecord.eleOrderStartTime);
+                    }
+                    if(vm.orderProcessRecord.paymentStartTime){
+                      vm.orderProcessRecord.paymentStartTime = parsedate(vm.orderProcessRecord.paymentStartTime);
+                    }
+                    if(vm.orderProcessRecord.waybillStartTime){
+                        vm.orderProcessRecord.waybillStartTime = parsedate(vm.orderProcessRecord.waybillStartTime);
+                    }
+                    if(vm.orderProcessRecord.customsSuccTime){
+                        vm.orderProcessRecord.customsSuccTime = parsedate(vm.orderProcessRecord.customsSuccTime);
+                    }
+                    if(vm.orderProcessRecord.addOrderStartTime){
+                        vm.orderProcessRecord.addOrderStartTime = parsedate(vm.orderProcessRecord.addOrderStartTime);
+                    }
+
+
                 }
             });
         },
         verification:function(){
 
+            if(vm.orderProcessRecord.isCustomsSend != 1){
+                alert("请等待清关完成");
+                return ;
+            }
+
             confirm('确认核销吗?', function () {
                 $.ajax({
                     type: "POST",
-                    url: "../order/printMsg",
+                    url: "../order/printMsgAndChangeCode",
                     contentType: "application/json",
-                    data: JSON.stringify(vm.currentOrderNo),
+                    data: JSON.stringify({'id':vm.currentOrderNo,'sessionId':vm.sessionId}),
                     success: function (r) {
                         if (r.ticket != null) {
                             // printArea(r.ticket);
-                            var content = getPrintContent(r.ticket);
+                            var content = getPrintContentOrder(r.ticket);
                             printArea(content);
                             alert('打印小票完成');
                         }else{
@@ -181,10 +248,24 @@ let vm = new Vue({
             })
         },
         refundOrder:function(){
-            console.log("退款的订单号:"+vm.currentOrderNo);
+            confirm('确认退款吗?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../order/orderRefund",
+                    contentType: "application/json",
+                    data: JSON.stringify({'orderId':9000,'sessionId':vm.sessionId}),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert("退款成功")
+                        }else{
+                            alert("退款失败,请联系管理员");
+                        }
+                    }
+                });
+            })
+
         },
         retrySendOrder:function(){
-            console.log("重推的订单号:"+vm.currentOrderNo);
         },
         getInfo: function (id) {
             $.get("../sys/notice/info/" + id, function (r) {
@@ -297,6 +378,7 @@ var removePrintArea = function (id) {
 var webSocket;
 
 function openWebSocket() {
+    var storeId = sessionStorage.getItem("storeId");
     if ("WebSocket" in window) {
         console.log("当前浏览器支持WebSocket");
 
@@ -305,7 +387,8 @@ function openWebSocket() {
         //注意ws、wss使用不同的端口。我使用自签名的证书测试,
         //无法使用wss,浏览器打开WebSocket时报错
         //ws对应http、wss对应https。
-        webSocket = new WebSocket("ws://localhost:8080/ws/server/{10}");
+        webSocket = new WebSocket("ws://183.62.225.124:8080/ws/server/"+storeId);
+        // webSocket = new WebSocket("ws://127.0.0.1:8080/ws/server/"+storeId);
         if (webSocket.readyState === webSocket.CONNECTING) {
             console.log('1.连接正在打开......');
         }
@@ -326,7 +409,17 @@ function openWebSocket() {
             var data = Object.assign({}, JSON.parse(msg.data));
             vm.sessionId = data.sessionId;
             vm.pickUpCodeList = [];
-            vm.pickUpCodeList = vm.pickUpCodeList.concat(data.pickUpCodeList);
+            if(data.pickUpCodeList.length > 0){
+                console.log(storeId);
+                for(var i = 0 ; i < data.pickUpCodeList.length ; i++){
+                    console.log(data.pickUpCodeList[i].storeId);
+                    if(data.pickUpCodeList[i].storeId === storeId){
+                        vm.pickUpCodeList.push(data.pickUpCodeList[i]);
+                    }
+                }
+            }
+            // vm.pickUpCodeList = vm.pickUpCodeList.concat(data.pickUpCodeList);
+            // console.log(vm.pickUpCodeList);
             // webSocket.send("2.client发测试消息:Client sent test msg。");
         };
         //连接关闭事件
@@ -365,3 +458,151 @@ function closeWebSocket() {
 window.unload = function () {
     webSocket.close();
 };
+
+
+function parsedate(value){
+    var date = new Date(value);
+    var year = date.getFullYear();
+    var month = date.getMonth()+1; //月份+1
+    var day = date.getDate();
+    var hour = date.getHours();
+    var minutes = date.getMinutes();
+    var second = date.getSeconds();
+    return  year+"-"+month+"-"+day+" "+hour+":"+minutes +":"+second;
+}
+
+function getPrintContentOrder(ticket) {
+    var content = "<div style=\"width: 250px;font-family: 微软雅黑;font-size: 8px;\">";
+    //小票头
+    content += "<div style=\"text-align: center;width: 100%;font-weight:bold;font-size: 13px;\">";
+    content += ticket.ticketHead.title;
+    content += "</div>";
+    /*content += "<div style=\"width: 100%;\">";
+    content += "会员:" + ticket.ticketHead.memberId;
+    content += "</div>";*/
+    content += "<div style=\"width: 100%;\">";
+    content += "订单号:" + ticket.ticketHead.orderId;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "交易时间:" + ticket.ticketHead.tradeTime;
+    content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    //商品信息
+    content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+    content += "<tr>";
+    content += "<td style=\"width: 50%;text-align: left;font-size: 10px;font-weight: bold;\">商品名称</td>";
+    content += "<td style=\"width: 17%;text-align: right;font-size: 10px;font-weight: bold;\">单价</td>";
+    content += "<td style=\"width: 15%;text-align: right;font-size: 10px;font-weight: bold;\">数量</td>";
+    content += "<td style=\"width: 18%;text-align: right;font-size: 10px;font-weight: bold;\">小计</td>";
+    content += "</tr>";
+    content += "</table>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+    for (var i=0;i< ticket.goods.length;i++){
+        content += "<tr>";
+        content += "<td style=\"width: 50%;text-align: left;font-size: 8px;padding-top: 8px;\">";
+        content += "<table style=\"width: 100%;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+        content += "<tr>";
+        content += "<td style=\"text-align: left;font-size: 8px;vertical-align:top;\">#</td>";
+        content += "<td style=\"text-align: left;font-size: 8px;\">" + ticket.goods[i].gname + "</td>";
+        content += "</tr>";
+        content += "</table>";
+        content += "</td>";
+        content += "<td style=\"width: 17%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].uprice + "</td>";
+        content += "<td style=\"width: 15%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].num + "</td>";
+        content += "<td style=\"width: 18%;text-align: right;font-size: 8px;vertical-align:bottom;padding-top: 8px;\">" + ticket.goods[i].subtotal + "元</td>";
+        content += "</tr>";
+
+    }
+    content += "</table>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    //收银信息
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">商品合计:</span>";
+    content += "<span style=\"float: left;width: 17%;text-align: left;\">" + ticket.cashInfo.goodsTotal + "件</span>";
+    content += "<span style=\"float: right;width: 33%;text-align: right;\">" + ticket.cashInfo.total + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">实收:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.receipts + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">找零:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.oddChange + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">优惠券:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.coupon + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">运费:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.freight + "元</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "<span style=\"float: left;width: 50%;text-align: left;\">支付渠道:</span>";
+    content += "<span style=\"float: right;width: 50%;text-align: right;\">" + ticket.cashInfo.paymentMode + "</span>";
+    content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    //海关清单信息
+    content += "<div style=\"width: 100%;\">";
+    content += "订单号:" + ticket.cusListing.orderId;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "运单编号:" + ticket.cusListing.waybillId;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "海关清单号:" + ticket.cusListing.invtNo;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "收货人:" + ticket.cusListing.consignee;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "收货人电话:" + ticket.cusListing.consigneeTel;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "始发地:" + ticket.cusListing.originAddress;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "交货地:" + ticket.cusListing.deliveryAddress;
+    content += "</div>";
+    content += "<div style=\"width: 100%;overflow:hidden;white-space: nowrap;\">--------------------------------------------------</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += ticket.ticketFoot.summary;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "客服电话:" + ticket.ticketFoot.serviceTel;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += "网址:" + ticket.ticketFoot.url1;
+    content += "</div>";
+    content += "<div style=\"width: 100%;\">";
+    content += ticket.ticketFoot.welcome;
+    content += "</div>";
+    return content;
+}
+
+
+function queryAssistantInfo(){
+    $.get("../sys/user/info", function (r) {
+
+        if(r.code == 0){
+            vm.sysUserInfo = r.user;
+
+            $.get("../store/getStoresByMerch?merchSn="+r.user.merchSn+"&_=1590374349985",function(result){
+                if(result.code == 0){
+                    for(var i = 0 ;i < result.list.length; i++){
+                        if(result.list[i].id == r.user.storeId){
+                            vm.storeName = result.list[i].storeName;
+                            break;
+                        }
+                    }
+                }
+            });
+
+        }
+    });
+
+
+}
+
+