diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java new file mode 100644 index 00000000..f46652ce --- /dev/null +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java @@ -0,0 +1,102 @@ +package com.czg.controller.admin; + +import com.czg.log.annotation.OperationLog; +import com.czg.product.dto.ShopVendorDTO; +import com.czg.product.service.ShopVendorService; +import com.czg.resp.CzgResult; +import com.czg.utils.AssertUtil; +import com.czg.validator.group.DefaultGroup; +import com.czg.validator.group.InsertGroup; +import com.czg.validator.group.UpdateGroup; +import com.mybatisflex.core.paginate.Page; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 供应商 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-02-20 + */ +@AllArgsConstructor +@RestController +@RequestMapping("/admin/product/vendor") +public class ShopVendorController { + private final ShopVendorService shopVendorService; + + /** + * 分页 + */ + @GetMapping("page") + @OperationLog("供应商-分页") + //@SaAdminCheckPermission("shopVendor:page") + public CzgResult> getShopVendorPage(ShopVendorDTO param) { + Page data = shopVendorService.getShopVendorPage(param); + return CzgResult.success(data); + } + + /** + * 列表 + */ + @GetMapping("list") + @OperationLog("供应商-列表") + //@SaAdminCheckPermission("shopVendor:list") + public CzgResult> getShopVendorList(ShopVendorDTO param) { + List data = shopVendorService.getShopVendorList(param); + return CzgResult.success(data); + } + + /** + * 详情 + * param id 供应商id + */ + @GetMapping("{id}") + @OperationLog("供应商-详情") + //@SaAdminCheckPermission("shopVendor:info") + public CzgResult getShopVendorById(@PathVariable("id") Long id) { + AssertUtil.isNull(id, "{}不能为空", "id"); + ShopVendorDTO data = shopVendorService.getShopVendorById(id); + return CzgResult.success(data); + } + + /** + * 新增 + */ + @PostMapping + @OperationLog("供应商-新增") + //@SaAdminCheckPermission("shopVendor:add") + public CzgResult addShopVendor(@RequestBody @Validated({InsertGroup.class, DefaultGroup.class}) ShopVendorDTO dto) { + shopVendorService.addShopVendor(dto); + return CzgResult.success(); + } + + /** + * 修改 + */ + @PutMapping + @OperationLog("供应商-修改") + //@SaAdminCheckPermission("shopVendor:update") + public CzgResult updateShopVendor(@RequestBody @Validated({UpdateGroup.class, DefaultGroup.class}) ShopVendorDTO dto) { + shopVendorService.updateShopVendor(dto); + return CzgResult.success(); + } + + /** + * 删除 + * + * @param id 供应商id + */ + @DeleteMapping("{id}") + @OperationLog("供应商-删除") + //@SaAdminCheckPermission("shopVendor:delete") + public CzgResult deleteShopVendor(@PathVariable("id") Long id) { + //效验数据 + AssertUtil.isNull(id, "{}不能为空", "id"); + shopVendorService.deleteShopVendor(id); + return CzgResult.success(); + } +} \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopProdUnitDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopProdUnitDTO.java index 0d563ff1..e0c68d75 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopProdUnitDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopProdUnitDTO.java @@ -9,6 +9,7 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; +import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; @@ -20,6 +21,8 @@ import java.time.LocalDateTime; */ @Data public class ShopProdUnitDTO implements Serializable { + + @Serial private static final long serialVersionUID = 1L; /** diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopVendorDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopVendorDTO.java new file mode 100644 index 00000000..b1b828c5 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ShopVendorDTO.java @@ -0,0 +1,93 @@ +package com.czg.product.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.czg.validator.group.DefaultGroup; +import com.czg.validator.group.InsertGroup; +import com.czg.validator.group.UpdateGroup; +import jakarta.validation.constraints.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 供应商 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-02-20 + */ +@Data +public class ShopVendorDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @Null(message = "ID必须为空", groups = InsertGroup.class) + @NotNull(message = "ID不能为空", groups = UpdateGroup.class) + private Long id; + /** + * 店铺Id + */ + private Long shopId; + /** + * 排序 + */ + @NotNull(message = "排序值不能为空", groups = DefaultGroup.class) + @Min(value = 1, message = "排序值不能小于1", groups = DefaultGroup.class) + @Max(value = Integer.MAX_VALUE, message = "排序值不能大于" + Integer.MAX_VALUE, groups = DefaultGroup.class) + private Integer sort; + /** + * 供应商名称 + */ + @NotBlank(message = "供应商名称不能为空", groups = DefaultGroup.class) + private String name; + /** + * 联系人名字 + */ + private String contactName; + /** + * 联系人电话 + */ + private String telephone; + /** + * 结算周期(日) + */ + private Integer period; + /** + * 供应商地址 + */ + private String address; + /** + * 标签 + */ + private String tip; + /** + * 备注 + */ + private String remark; + /** + * 创建时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + /** + * 更新时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + /** + * 最后一次交易时间(主要做排序) + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastTransactTime; + /** + * 逻辑删除 1-是 0-否 + */ + @JSONField(serialize = false) + private Integer isDel; + +} \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java new file mode 100644 index 00000000..e419707c --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java @@ -0,0 +1,85 @@ +package com.czg.product.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 供应商 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-02-20 + */ +@Data +@Table("tb_shop_vendor") +public class ShopVendor implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @Id(keyType = KeyType.Auto) + private Long id; + /** + * 店铺Id + */ + private Long shopId; + /** + * 排序 + */ + private Integer sort; + /** + * 供应商名称 + */ + private String name; + /** + * 联系人名字 + */ + private String contactName; + /** + * 联系人电话 + */ + private String telephone; + /** + * 结算周期(日) + */ + private Integer period; + /** + * 供应商地址 + */ + private String address; + /** + * 标签 + */ + private String tip; + /** + * 备注 + */ + private String remark; + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + /** + * 更新时间 + */ + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + /** + * 最后一次交易时间(主要做排序) + */ + private LocalDateTime lastTransactTime; + /** + * 逻辑删除 1-是 0-否 + */ + private Integer isDel; +} \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java new file mode 100644 index 00000000..a6ddaca4 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java @@ -0,0 +1,29 @@ +package com.czg.product.service; + +import com.czg.product.dto.ShopVendorDTO; +import com.czg.product.entity.ShopVendor; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; + +import java.util.List; + +/** + * 供应商 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-02-20 + */ +public interface ShopVendorService extends IService { + Page getShopVendorPage(ShopVendorDTO param); + + List getShopVendorList(ShopVendorDTO param); + + ShopVendorDTO getShopVendorById(Long id); + + boolean addShopVendor(ShopVendorDTO dto); + + boolean updateShopVendor(ShopVendorDTO dto); + + boolean deleteShopVendor(Long id); + +} \ No newline at end of file diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java new file mode 100644 index 00000000..d689ce2b --- /dev/null +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java @@ -0,0 +1,16 @@ +package com.czg.service.product.mapper; + +import com.czg.product.entity.ShopVendor; +import com.mybatisflex.core.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 供应商 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-02-20 + */ +@Mapper +public interface ShopVendorMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java new file mode 100644 index 00000000..4f0bbc2f --- /dev/null +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java @@ -0,0 +1,96 @@ +package com.czg.service.product.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.czg.enums.DeleteEnum; +import com.czg.exception.CzgException; +import com.czg.product.dto.ShopVendorDTO; +import com.czg.product.entity.ShopVendor; +import com.czg.product.service.ShopVendorService; +import com.czg.sa.StpKit; +import com.czg.service.product.mapper.ShopVendorMapper; +import com.czg.utils.PageUtil; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.update.UpdateChain; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 供应商 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-02-20 + */ +@Service +public class ShopVendorServiceImpl extends ServiceImpl implements ShopVendorService { + + private QueryWrapper buildQueryWrapper(ShopVendorDTO param) { + QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); + if (StrUtil.isNotEmpty(param.getName())) { + queryWrapper.like(ShopVendor::getName, param.getName()); + } + Long shopId = StpKit.USER.getLoginIdAsLong(); + queryWrapper.eq(ShopVendor::getShopId, shopId); + queryWrapper.orderBy(ShopVendor::getSort, true); + queryWrapper.orderBy(ShopVendor::getId, false); + return queryWrapper; + } + + @Override + public Page getShopVendorPage(ShopVendorDTO param) { + QueryWrapper queryWrapper = buildQueryWrapper(param); + return super.pageAs(PageUtil.buildPage(), queryWrapper, ShopVendorDTO.class); + } + + @Override + public List getShopVendorList(ShopVendorDTO param) { + QueryWrapper queryWrapper = buildQueryWrapper(param); + queryWrapper.eq(ShopVendor::getIsDel, DeleteEnum.NORMAL.value()); + return super.listAs(queryWrapper, ShopVendorDTO.class); + } + + @Override + public ShopVendorDTO getShopVendorById(Long id) { + Long shopId = StpKit.USER.getLoginIdAsLong(); + return super.getOneAs(query().eq(ShopVendor::getId, id).eq(ShopVendor::getShopId, shopId), ShopVendorDTO.class); + } + + @Override + public boolean addShopVendor(ShopVendorDTO dto) { + Long shopId = StpKit.USER.getLoginIdAsLong(); + boolean exists = super.exists(query().eq(ShopVendor::getName, dto.getName()).eq(ShopVendor::getShopId, shopId)); + if (exists) { + throw new CzgException("供应商已存在"); + } + ShopVendor entity = BeanUtil.copyProperties(dto, ShopVendor.class); + entity.setIsDel(DeleteEnum.NORMAL.value()); + entity.setShopId(shopId); + return super.save(entity); + } + + @Override + public boolean updateShopVendor(ShopVendorDTO dto) { + Long shopId = StpKit.USER.getLoginIdAsLong(); + dto.setShopId(shopId); + boolean exists = super.exists(query().eq(ShopVendor::getName, dto.getName()).eq(ShopVendor::getShopId, shopId).ne(ShopVendor::getId, dto.getId())); + if (exists) { + throw new CzgException("供应商已存在"); + } + ShopVendor entity = BeanUtil.copyProperties(dto, ShopVendor.class); + return super.updateById(entity); + } + + @Override + public boolean deleteShopVendor(Long id) { + Long shopId = StpKit.USER.getLoginIdAsLong(); + return UpdateChain.of(ShopVendor.class) + .set(ShopVendor::getIsDel, DeleteEnum.DELETED.value()) + .eq(ShopVendor::getId, id) + .eq(ShopVendor::getShopId, shopId) + .update(); + } + +} \ No newline at end of file diff --git a/cash-service/product-service/src/main/resources/mapper/ShopVendorMapper.xml b/cash-service/product-service/src/main/resources/mapper/ShopVendorMapper.xml new file mode 100644 index 00000000..8425ce76 --- /dev/null +++ b/cash-service/product-service/src/main/resources/mapper/ShopVendorMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file