Browse Source

增加票组销量及状态字段

chunping 3 years ago
parent
commit
199313a9ec

+ 5 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java

@@ -146,6 +146,7 @@ public class FileUploadController extends BaseApiController {
                 name = cropPicAndUpLoadOSS(file, mimeType, 480, 480, bucketName);
             }else if (PicHandlerTypeEnum.COMPRESSION.getValue().equals(handlerType)) {
                 // 压缩并上传图片
+                // 后台不用压缩
                 name = commpressPicAndUpLoadOSS(file, mimeType, bucketName);
             }
             if (StringUtils.isBlank(name)) {
@@ -242,7 +243,9 @@ public class FileUploadController extends BaseApiController {
         String name = UUIDUtils.newId() + suffix;
         try {
             QcloudFileUtils.putStream(file.getInputStream(), name, bucketName, mimeType );
-            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
+
+            // 后台不再需要压缩,直接前端调用cos的压缩方法 2022.4.20
+ /*           BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
 //            Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
 
 
@@ -293,7 +296,7 @@ public class FileUploadController extends BaseApiController {
             if(outFile.exists()) {
                 LogUtil.info(log, "delete file..."+outFilePath);
                 outFile.delete();
-            }
+            }*/
         }  catch (Exception e) {
             LogUtil.error(log, e, "");
             return null;

+ 0 - 1
mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java

@@ -3,7 +3,6 @@ package com.qs.mp.service;
 import com.qs.mp.MpApplication;
 import com.qs.mp.admin.service.ITicketBoxSerialService;
 import com.qs.mp.framework.service.IWxUrlLinkService;
-import com.qs.mp.quartz.task.CosTask;
 import com.qs.mp.quartz.task.DayStatTask;
 import com.qs.mp.quartz.task.TicketBoxTask;
 import java.io.IOException;

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgSaleStatusEnum.java

@@ -0,0 +1,44 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票包用户端销售状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketPkgSaleStatusEnum implements IEnum<Integer> {
+
+  WAIT_SALE(1, "待售"),
+  ON_SALE(2, "销售中"),
+  SALE_OUT(3, "已售罄");
+
+  private final Integer value;
+  private final String desc;
+
+  TicketPkgSaleStatusEnum(final Integer value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 1 - 1
mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgStatusEnum.java

@@ -7,7 +7,7 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 
 /**
  *
- * 盲票包销售状态
+ * 盲票包门店销售状态
  *
  */
 @JSONType(deserializer = EnumValueDeserializer.class)

+ 0 - 179
mp-quartz/src/main/java/com/qs/mp/quartz/task/CosTask.java

@@ -1,179 +0,0 @@
-package com.qs.mp.quartz.task;
-
-import com.qcloud.cos.COSClient;
-import com.qcloud.cos.exception.CosClientException;
-import com.qcloud.cos.exception.CosServiceException;
-import com.qcloud.cos.model.COSObjectSummary;
-import com.qcloud.cos.model.GetObjectRequest;
-import com.qcloud.cos.model.ListObjectsRequest;
-import com.qcloud.cos.model.ObjectListing;
-import com.qcloud.cos.model.ObjectMetadata;
-import com.qs.mp.common.image.CompressUtil;
-import com.qs.mp.common.qcloud.QcloudFileUtils;
-import com.qs.mp.common.utils.LogUtil;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import javax.imageio.ImageIO;
-import net.coobird.thumbnailator.Thumbnails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-
-/**
- * 腾讯 COS 操作任务
- *
- * @author Cup
- * @date 2022/4/15
- */
-@Component("cosTask")
-public class CosTask {
-
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
-
-
-  /**
-   * 文件上传路径
-   */
-  @Value("${mp.profile}")
-  public String filePath;
-
-  /**
-   * 公开
-   */
-  @Value("${cloud.public-bucket-name}")
-  private String publicBucketName;
-
-
-  /**
-   * 腾讯COS图片压缩替换任务
-   */
-  public void compressPicture() throws IOException, InterruptedException {
-    LogUtil.info(logger, "...图片压缩替换任务开始...");
-
-    ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
-    // 设置bucket名称
-    listObjectsRequest.setBucketName(publicBucketName);
-    // prefix表示列出的object的key以prefix开始
-    listObjectsRequest.setPrefix("/");
-    // deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
-    listObjectsRequest.setDelimiter("/");
-    // 设置最大遍历出多少个对象, 一次listobject最大支持1000
-    listObjectsRequest.setMaxKeys(500);
-    ObjectListing objectListing = null;
-    do {
-      try {
-        COSClient cosClient = QcloudFileUtils.getCosClient();
-        objectListing = cosClient.listObjects(listObjectsRequest);
-      } catch (CosServiceException e) {
-        e.printStackTrace();
-        return;
-      } catch (CosClientException e) {
-        e.printStackTrace();
-        return;
-      }
-      // common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
-      List<String> commonPrefixs = objectListing.getCommonPrefixes();
-
-      // object summary表示所有列出的object列表
-      List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
-
-      for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
-        // 文件的路径key
-        String key = cosObjectSummary.getKey();
-
-        if (key.length() < 2) {
-          continue;
-        }
-
-        if ("_s".equals(key.substring(key.length() - 2))) {
-          //  if("EJU6PLW0GUARR4EWIHZA.jpg_s".equals(key)) {
-          // 获取原图文件名
-          String picName = key.substring(0, key.length() - 2);
-          System.err.println("key = " + picName);
-          try {
-            uploadAndCommpressImg(picName);
-          } catch (Exception e) {
-            System.err.println(e);
-          }
-        }
-      }
-      String nextMarker = objectListing.getNextMarker();
-      listObjectsRequest.setMarker(nextMarker);
-    } while (objectListing.isTruncated());
-
-    LogUtil.info(logger, "...图片压缩替换完成!!...");
-  }
-
-  private void uploadAndCommpressImg(String key) throws IOException, InterruptedException {
-    String path = filePath + "/thumb/" + key;
-    File downFile = new File(path);
-    GetObjectRequest getObjectRequest = new GetObjectRequest(publicBucketName, key);
-    COSClient cosClient = QcloudFileUtils.getCosClient();
-    ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
-//        FileInputStream fileInputStream = new FileInputStream(path);
-    String contentType = downObjectMeta.getContentType();
-//        QcloudFileUtils.putStream(fileInputStream, key, publicBucketName, mimeType);
-
-    // 压缩图片
-    BufferedImage bufferedImage = ImageIO.read(downFile);
-//    Thumbnails.Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
-    int pWidth = bufferedImage.getWidth();
-    int pHeight = bufferedImage.getHeight();
-//    builder.size(pWidth, pHeight);
-    double accuracy = CompressUtil.getAccuracy(downObjectMeta.getContentLength()/1024);
-    LogUtil.info(logger, "原始文件长:{0},大小:{1},类型:{2},压缩比:{3}", pWidth, downObjectMeta.getContentLength()/1024, contentType, 0.8);
-
-    String outFileDir = filePath + "/thumb";
-    File tempFile = new File(outFileDir);
-    if (!tempFile.exists()) {
-      tempFile.mkdirs();
-    }
-    String thumbName = key + "_s";
-    String outFilePath =
-        filePath + "/thumb/" + thumbName + "." + contentType.substring(contentType.lastIndexOf("/") + 1);
-//    builder.toFile(outFilePath);
-
-    // 压缩图片
-    // 压缩图片
-    // 压缩图片
-    if (pWidth > 500) {
-      float scale = 500f / pWidth;
-      if ("image/png".equals(contentType)) {
-        Thumbnails.of(bufferedImage).scale(scale > 0.5 ? 0.5 : scale).outputQuality(0.8)
-            .imageType(BufferedImage.TYPE_INT_ARGB).outputFormat("png")
-            .toFile(outFilePath);
-      } else {
-        Thumbnails.of(bufferedImage).scale(scale).outputQuality(0.8).toFile(outFilePath);
-      }
-    }else {
-      if ("image/png".equals(contentType)) {
-        Thumbnails.of(bufferedImage).scale(0.5).outputQuality(0.8)
-            .imageType(BufferedImage.TYPE_INT_ARGB).outputFormat("png")
-            .toFile(outFilePath);
-      } else {
-        Thumbnails.of(bufferedImage).scale(1f).outputQuality(0.8).toFile(outFilePath);
-      }
-    }
-
-    File outFile = new File(outFilePath);
-    LogUtil.info(logger, "压缩后文件大小:{0}", outFile.length()/ 1024);
-    if (outFile.length() > downObjectMeta.getContentLength()) {
-      // 没压缩,则使用原文件作为缩略图
-      QcloudFileUtils.putFile(downFile, thumbName, publicBucketName, contentType);
-    } else {
-      QcloudFileUtils.putFile(outFile, thumbName, publicBucketName, contentType);
-    }
-
-    downFile.delete();
-    outFile.delete();
-
-
-  }
-
-
-}
-

+ 0 - 78
mp-quartz/src/main/java/com/qs/mp/quartz/task/PictureTask.java

@@ -1,78 +0,0 @@
-package com.qs.mp.quartz.task;
-
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.qs.mp.admin.domain.Goods;
-import com.qs.mp.admin.service.IGoodsService;
-import com.qs.mp.admin.service.impl.GoodsServiceImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 图片相关处理任务
- *
- * @author Cup
- * @date 2022/4/18
- */
-@Component("pictureTask")
-public class PictureTask {
-
-    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
-
-
-    @Autowired
-    private IGoodsService goodsService;
-
-
-    public void detailPictureReplace(Long goodsId) {
-        List<Goods> goodsList = new ArrayList<>();
-        Goods goods = goodsService.getById(goodsId);
-        if (goods != null) {
-            goodsList.add(goods);
-            pictureReplace(goodsList);
-        }
-    }
-
-    public void detailPictureReplace() {
-        List<Goods> goodsList = goodsService.list();
-        if (CollectionUtils.isNotEmpty(goodsList)) {
-            pictureReplace(goodsList);
-        }
-
-    }
-
-    /**
-     * 商品详情图片处理方法
-     */
-    private void pictureReplace(List<Goods> goodsList) {
-        if (CollectionUtils.isNotEmpty(goodsList)) {
-            List<Goods> params = new ArrayList<>();
-            for (Goods goods : goodsList) {
-                String desc = goods.getDescription();
-                if (StringUtils.isBlank(desc)) {
-                    continue;
-                }
-                // 将字符串中所有的.jpg和.png 替换为.jpg_s和.png_s
-                String result = desc.replaceAll(".jpg\"", ".jpg_s\"").replaceAll(".jpeg\"", ".jpeg_s\"").replaceAll(".png\"", ".png_s\"");
-                Goods param = new Goods();
-                param.setGoodsId(goods.getGoodsId());
-                param.setDescription(result);
-                params.add(param);
-            }
-
-            // 批量修改商品详情图片
-            if (CollectionUtils.isNotEmpty(params)) {
-                goodsService.updateBatchById(params);
-            }
-        }
-    }
-
-
-
-}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketPackage.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
@@ -59,6 +60,25 @@ public class TicketPackage implements Serializable {
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketPkgStatusEnum status;
 
+  /**
+   * 用户端销售状态(待售、销售中、已售罄)
+   */
+  @TableField("sale_status")
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private TicketPkgSaleStatusEnum saleStatus;
+
+  /**
+   * 销售张数
+   */
+  @TableField("sale_qty")
+  private Integer saleQty;
+
+  /**
+   * 每包张数
+   */
+  @TableField("pkg_unit")
+  private Integer pkgUnit;
+
   /**
    * 创建时间
    */

+ 4 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -26,6 +26,7 @@ import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
@@ -201,6 +202,9 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
       ticketPackage.setEndSn(
           ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + pkgUnit));
       ticketPackage.setStatus(TicketPkgStatusEnum.FOR_SALE);
+      ticketPackage.setSaleStatus(TicketPkgSaleStatusEnum.WAIT_SALE);
+      ticketPackage.setSaleQty(0);
+      ticketPackage.setPkgUnit(ticketBox.getPkgUnit());
       ticketPackageList.add(ticketPackage);
 
       List<PkgAwards> pkgAwardsList = pkgAwardsMap.get(key);

+ 16 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelCommission;
@@ -26,6 +28,7 @@ import com.qs.mp.common.enums.CommStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
@@ -106,6 +109,9 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private IChannelMoneyLogService channelMoneyLogService;
 
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -379,6 +385,7 @@ public class UserTicketOrderServiceImpl extends
             new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty, ticketBox.getSaleQty() + 1)
                 .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
       }
+
       // 开幸运数字,更新ticket状态为已激活
       boolean rtn = ticketService.update(
           new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
@@ -386,6 +393,15 @@ public class UserTicketOrderServiceImpl extends
               .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
               .eq(Ticket::getTicketId, ticket.getTicketId()));
       Assert.isTrue(rtn, "支付回调用户购票订单处理,更新盲票状态失败,ticketId:" + ticket.getTicketId());
+
+      // 更新票组销售数量,此处只做累计,允许并发容错
+      TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
+      ticketPackageService.update(new LambdaUpdateWrapper<TicketPackage>()
+          .set(TicketPkgSaleStatusEnum.WAIT_SALE == ticketPackage.getSaleStatus(), TicketPackage::getSaleStatus, TicketPkgSaleStatusEnum.ON_SALE)
+          .set(TicketPkgSaleStatusEnum.ON_SALE == ticketPackage.getSaleStatus() && ticketPackage.getSaleQty()+1 >= ticketPackage.getPkgUnit(), TicketPackage::getSaleStatus, TicketPkgSaleStatusEnum.SALE_OUT)
+          .set(TicketPackage::getSaleQty, ticketPackage.getSaleQty() + 1)
+          .eq(TicketPackage::getPkgId, ticketPackage.getPkgId()));
+
     }
 
     // 更新订单状态为已完成

+ 6 - 3
mp-service/src/main/resources/mapper/admin/TicketPackageMapper.xml

@@ -10,16 +10,19 @@
         <result column="start_sn" property="startSn" />
         <result column="end_sn" property="endSn" />
         <result column="status" property="status" />
+        <result column="sale_status" property="saleStatus" />
+        <result column="sale_qty" property="saleQty" />
+        <result column="pkg_unit" property="pkgUnit" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        pkg_id, box_id, pkg_no, start_sn, end_sn, status, created_time, updated_time
+        pkg_id, box_id, pkg_no, start_sn, end_sn, status, sale_status, sale_qty, pkg_unit, created_time, updated_time
     </sql>
-    
-    
+
+
     <!-- 查询盲票包列表 -->
     <select id="listTicketPackageVO" resultType="com.qs.mp.admin.domain.vo.TicketPackageVO">
 		select t1.* , t2.title