This commit is contained in:
dzc committed 2025-08-29 17:50:56 +08:00
commit d5baec6efb
17 files changed
+212 -24

No files matched your search

@@ -0,0 +1,27 @@
package com.bsd.pjcloud.integrated.dto.visitor.app;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 访客表
*
* @author zjf
* @date 2025-04-09 15:22:47
*/
@Data
@Schema(description = "app访客dto")
public class VisitorsReceiveAppDTO {
private Long id;
private String checkStatus;
private VisitorsAppDTO visitorsAppDTO;
}
@@ -12,6 +12,7 @@ import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsReceiveAppDTO;
import com.bsd.pjcloud.integrated.entity.CarInfoEntity;
import com.bsd.pjcloud.integrated.entity.VisitorUserEntity;
import com.bsd.pjcloud.integrated.entity.VisitorsEntity;
@@ -106,6 +107,13 @@ public class AppVisitorController {
return R.ok(visitorsService.getByToken(token));
}
@PostMapping("/app/receiveYY")
@SysLog("访客接收邀约更新状态" )
@Operation(summary = "访客接收邀约" , description = "访客接收邀约" )
public R receiveYY(@RequestBody VisitorsReceiveAppDTO visitorsReceiveAppDTO) {
return R.ok( visitorsService.receiveYY(visitorsReceiveAppDTO));
}
/**
* 扫码发送请求确认是否能通过
* 通过token查询访客表
@@ -201,4 +201,8 @@ public class VisitorsEntity extends Model<VisitorsEntity> {
@Schema(description="到访单位名称")
private String deptName;
@Schema(description="访客用户id")
private Long visitorUserId;
}
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.admin.api.entity.SysDictItem;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsReceiveAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsYYAppDTO;
import com.bsd.pjcloud.integrated.entity.VisitorsEntity;
import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsAppVo;
@@ -82,4 +83,7 @@ public interface VisitorsService extends IService<VisitorsEntity> {
* @return
*/
R<List<SysDictItem>> getDictListByType(Long type);
Object receiveYY(VisitorsReceiveAppDTO visitorsReceiveAppDTO);
}
@@ -26,10 +26,7 @@ import com.bsd.pjcloud.integrated.constant.DictTypeEnum;
import com.bsd.pjcloud.integrated.constant.IntegratedFlowConstant;
import com.bsd.pjcloud.integrated.constant.VisitorTypeEnum;
import com.bsd.pjcloud.integrated.controller.AppVisitorUserController;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsCarAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsPeopleAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsYYAppDTO;
import com.bsd.pjcloud.integrated.dto.visitor.app.*;
import com.bsd.pjcloud.integrated.entity.VisitorUserEntity;
import com.bsd.pjcloud.integrated.entity.VisitorsCarEntity;
import com.bsd.pjcloud.integrated.entity.VisitorsEntity;
@@ -454,5 +451,91 @@ public class VisitorsServiceImpl extends ServiceImpl<VisitorsMapper, VisitorsEnt
return null;
}
@Override
public Object receiveYY(VisitorsReceiveAppDTO visitorsReceiveAppDTO) {
Long id = visitorsReceiveAppDTO.getId();
String checkStatus = visitorsReceiveAppDTO.getCheckStatus();
Long currentVisitorUserId = getCurrentVisitorUserId();
//邀约者的数据信息
VisitorsEntity yyVisitors = baseMapper.selectById(id);
if (yyVisitors == null) {
throw new ServiceException("该访客信息不存在");
}
//查询当前用户信息
VisitorUserEntity visitorUserEntity = visitorUserService.getById(currentVisitorUserId);
if (visitorUserEntity == null || "1".equals(visitorUserEntity.getStatus()) || !yyVisitors.getMobile().equals(visitorUserEntity.getPhone())) {
throw new ServiceException("您没有权限");
}
//这里判断的是邀约者的那条信息是否有效
if (!yyVisitors.getCheckStatus().equals(TaskCheckStatusEnum.PADDING.getCode())){
throw new ServiceException("该邀约信息已失效");
}
//这里的状态属于前端点了接受还是拒绝
if (checkStatus.equals(TaskCheckStatusEnum.RESULT.getCode())){
//接受,自动创建访客预约,并且设置自动通过
VisitorsEntity dataVisitors = new VisitorsEntity();
dataVisitors.setVisitorUserId(currentVisitorUserId);
dataVisitors.setDeptId(yyVisitors.getDeptId());
dataVisitors.setDeptName(yyVisitors.getDeptName());
dataVisitors.setUserId(currentVisitorUserId);
dataVisitors.setCheckStatus(TaskCheckStatusEnum.RESULT.getCode());
dataVisitors.setType(VisitorTypeEnum.FKSQ.getType());
String uniqueToken = UUID.randomUUID().toString();
String token = uniqueToken.replace("-", "");
dataVisitors.setToken(token);
dataVisitors.setIsDrive(yyVisitors.getIsDrive());
dataVisitors.setIsOtherPeople(yyVisitors.getIsOtherPeople());
String isDrive = yyVisitors.getIsDrive();
String isOtherPeople = yyVisitors.getIsOtherPeople();
baseMapper.insert(dataVisitors);
VisitorsAppDTO visitorsAppDTO = visitorsReceiveAppDTO.getVisitorsAppDTO();
if (isDrive.equals("1")){
//保存车辆信息
List<VisitorsCarAppDTO> visitorsCarAppDTOList = visitorsAppDTO.getCarList();
if (!CollectionUtils.isEmpty(visitorsCarAppDTOList)){
List<VisitorsCarEntity> visitorsCarEntities = BeanUtils.toBean(visitorsCarAppDTOList, VisitorsCarEntity.class);
visitorsCarEntities.forEach(i->{
i.setVisitorsId(dataVisitors.getId());
});
visitorsCarMapper.insert(visitorsCarEntities);
}
}
if (isOtherPeople.equals("1")){
List<VisitorsPeopleAppDTO> visitorsPeopleAppDTOList =visitorsAppDTO.getOtherPeople();
// if (!CollectionUtils.isEmpty(visitorsPeopleAppDTOList)){
// visitorsPeopleAppDTOList.forEach(i->{
// VisitorInfo itemVisitorInfo = new VisitorInfo();
// itemVisitorInfo.setVisitorName(i.getName());
// itemVisitorInfo.setPhoneNo(i.getMobile());
// itemVisitorInfo.setvis
// });
// }
if (!CollectionUtils.isEmpty(visitorsPeopleAppDTOList)){
List<VisitorsPeopleEntity> visitorsPeopleEntities = BeanUtils.toBean(visitorsPeopleAppDTOList, VisitorsPeopleEntity.class);
for (int i = 0; i < visitorsPeopleEntities.size(); i++){
VisitorsPeopleEntity visitorsPeopleEntity = visitorsPeopleEntities.get(i);
visitorsPeopleEntity.setVisitorsId(dataVisitors.getId());
}
visitorsPeopleMapper.insert(visitorsPeopleEntities);
}
}
return dataVisitors.getId();
}
//拒绝
VisitorsEntity visitorsEntity = new VisitorsEntity();
visitorsEntity.setId(id);
visitorsEntity.setCheckStatus(TaskCheckStatusEnum.REJECT.getCode());
return baseMapper.updateById(visitorsEntity);
}
}
@@ -36,5 +36,7 @@
<result property="qrcode" column="qrcode"/>
<result property="verificationCode" column="verification_code"/>
<result property="yyId" column="yy_id"/>
<result property="deptName" column="dept_name"/>
<result property="visitorUserId" column="visitor_user_id"/>
</resultMap>
</mapper>
@@ -20,13 +20,9 @@
package com.bsd.pjcloud.supermarket.api.feign;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.constant.ServiceNameConstants;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO;
import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity;
import com.bsd.pjcloud.supermarket.vo.app.ShopSpuDetailAppVo;
import com.bsd.pjcloud.supermarket.vo.app.ShopSpuListAppVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -34,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO;
/**
* @author zjf
@@ -45,17 +42,10 @@ public interface RemoteShopSkuService {
/**
* 更新库存
* @return
*/
/**
* 根据skuId和数量扣减库存
* @param skuId
* @param num * 正数:增加库存,负数:扣减库存
* @return
* 批量扣减/增减库存(正数增加,负数扣减)
*/
@PostMapping("/app/shopSpu/deductStock")
R<Boolean> deductStock(@RequestParam Long skuId, @RequestParam Integer num);
R<Boolean> deductStock(@RequestBody SkuStockChangeDTO changes);
/**
@@ -0,0 +1,28 @@
package com.bsd.pjcloud.supermarket.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Data
public class SkuStockChangeDTO {
@NotNull(message = "商品 SPU 不能为空")
private List<Item> items;
@Schema(description = "下单设备类型,0默认安卓机,1移动端")
private int deviceType;
@Data
public static class Item {
@NotNull(message = "包装单位unit 编号不能为空")
private Long id;
@NotNull(message = "库存变化数量不能为空")
private Double incrCount;
}
}
@@ -166,6 +166,12 @@ public class ShopSpuEntity extends Model<ShopSpuEntity> {
@Schema(description="是否删除")
private String delFlag;
/**
* 商品性质(字典)
*/
@Schema(description="商品性质(字典)")
private String productNature;
/**
* 租户编号
*/
@@ -75,6 +75,9 @@ public class ShopSpuDetailAppVo {
@Schema(description="单人限购数量")
private Integer limitNum;
@Schema(description="商品性质(字典)")
private String productNature;
private List<ShopSkuAppVo> skuList;
}
@@ -49,4 +49,11 @@ public class ShopSpuListAppVo {
@Schema(description="总销量")
private Double salesCount;
/**
* 商品性质(字典)
*/
@Schema(description="商品性质(字典)")
private String productNature;
}
@@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO;
@RestController
@RequestMapping("/app/shopSpu")
@@ -105,9 +106,9 @@ public class AppShopSpuController {
}
@PostMapping("/deductStock")
@Operation(summary = "扣减库存", description = "根据skuId和数量扣减库存")
public R<Boolean> deductStock(@RequestParam Long skuId, @RequestParam Integer num) {
boolean result = shopSkuService.deductStock(skuId, num);
@Operation(summary = "批量增减库存", description = "正加负减,任一失败全失败")
public R<Boolean> deductStock(@RequestBody SkuStockChangeDTO changes) {
boolean result = shopSkuService.deductStockBatch(changes);
return result ? R.ok(true) : R.failed("库存不足或扣减失败");
}
@@ -15,6 +15,6 @@ public interface ShopSkuMapper extends PjcloudBaseMapper<ShopSkuEntity> {
* @param version 当前版本号
* @return 影响行数
*/
int deductStock(Long skuId, Integer num, Integer version);
int deductStock(Long skuId, Double num, Integer version);
}
@@ -12,5 +12,10 @@ public interface ShopSkuService extends IService<ShopSkuEntity> {
* @param num 增减数量(正数加,负数减)
* @return 是否成功
*/
boolean deductStock(Long skuId, Integer num);
boolean deductStock(Long skuId, Double num);
/**
* 批量增减库存(正数增加,负数扣减),任一失败则返回false
*/
boolean deductStockBatch(com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO changes);
}
@@ -7,6 +7,8 @@ import com.bsd.pjcloud.supermarket.mapper.ShopSkuMapper;
import com.bsd.pjcloud.supermarket.mapper.ShopSpuMapper;
import com.bsd.pjcloud.supermarket.service.ShopSkuService;
import lombok.AllArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO;
import org.springframework.stereotype.Service;
/**
* sku
@@ -24,7 +26,7 @@ public class ShopSkuServiceImpl extends ServiceImpl<ShopSkuMapper, ShopSkuEntity
* 正数:增加库存,负数:扣减库存
*/
@Override
public boolean deductStock(Long skuId, Integer num) {
public boolean deductStock(Long skuId, Double num) {
for (int i = 0; i < 3; i++) { // 最多重试3次
ShopSkuEntity sku = this.getById(skuId);
if (sku == null) return false;
@@ -38,9 +40,25 @@ public class ShopSkuServiceImpl extends ServiceImpl<ShopSkuMapper, ShopSkuEntity
}
int updated = baseMapper.deductStock(skuId, num, sku.getVersion());
//更新spu已售总数
shopSpuMapper.updateSalesCount(shopSkuEntity.getSpuId(),num);
shopSpuMapper.updateSalesCount(shopSkuEntity.getSpuId(), num.intValue());
if (updated > 0) return true;
}
return false;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deductStockBatch(SkuStockChangeDTO changes) {
if (changes == null || changes.getItems() == null || changes.getItems().isEmpty()) {
return true;
}
for (SkuStockChangeDTO.Item item : changes.getItems()) {
if (item == null || item.getId() == null || item.getIncrCount() == null) return false;
boolean ok = deductStock(item.getId(), item.getIncrCount());
if (!ok) {
throw new RuntimeException("扣减库存失败,skuId=" + item.getId());
}
}
return true;
}
}
@@ -27,6 +27,7 @@
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
<result property="productNature" column="product_nature"/>
</resultMap>
<update id="updateSalesCount">
UPDATE shop_spu