Merge remote-tracking branch 'origin/master'

This commit is contained in:
GYJ 2025-04-06 18:06:14 +08:00
commit 731a62fb74
30 changed files with 824 additions and 62 deletions

View File

@ -56,12 +56,10 @@ public class ShopPagePermissionController {
*/ */
@GetMapping("/detail") @GetMapping("/detail")
public CzgResult<List<ShopPagePath>> detail(@RequestParam Long staffId) { public CzgResult<List<ShopPagePath>> detail(@RequestParam Long staffId) {
Set<Long> pageIdList = shopStaffPagePermissionService.list(new QueryWrapper().eq(ShopStaffPagePermission::getShopId, if (StpKit.USER.isStaff() && StpKit.USER.getLoginIdAsLong() != staffId) {
StpKit.USER.getShopId()).eq(ShopStaffPagePermission::getStaffId, staffId)).stream().map(ShopStaffPagePermission::getPagePathId).collect(Collectors.toSet()); return CzgResult.failure("员工无权限");
if (pageIdList.isEmpty()) {
return CzgResult.success(new ArrayList<>());
} }
return CzgResult.success(shopPagePathService.list(new QueryWrapper().in(ShopPagePath::getId, pageIdList))); return CzgResult.success(shopPagePathService.detail(staffId));
} }
/** /**
@ -69,7 +67,8 @@ public class ShopPagePermissionController {
*/ */
@GetMapping("/mine") @GetMapping("/mine")
public CzgResult<List<ShopPagePath>> mine() { public CzgResult<List<ShopPagePath>> mine() {
Set<Long> pageIdList = shopStaffPagePermissionService.list(new QueryWrapper().eq(ShopStaffPagePermission::getShopId, StpKit.USER.getShopId()).eq(ShopStaffPagePermission::getStaffId, StpKit.USER.getLoginIdAsLong())).stream().map(ShopStaffPagePermission::getPagePathId).collect(Collectors.toSet()); Set<Long> pageIdList = shopStaffPagePermissionService.list(new QueryWrapper().eq(ShopStaffPagePermission::getShopId, StpKit.USER.getShopId()).eq(ShopStaffPagePermission::getIsUse, 1)
.eq(ShopStaffPagePermission::getStaffId, StpKit.USER.getLoginIdAsLong())).stream().map(ShopStaffPagePermission::getPagePathId).collect(Collectors.toSet());
if (pageIdList.isEmpty()) { if (pageIdList.isEmpty()) {
return CzgResult.success(new ArrayList<>()); return CzgResult.success(new ArrayList<>());
} }

View File

@ -1,9 +1,10 @@
package com.czg.controller; package com.czg.controller.admin;
import com.czg.enums.CrudEnum; import com.czg.enums.CrudEnum;
import com.czg.log.annotation.OperationLog; import com.czg.log.annotation.OperationLog;
import com.czg.product.dto.ConsInfoDTO; import com.czg.product.dto.ConsInfoDTO;
import com.czg.product.param.ConsInfoParam; import com.czg.product.param.ConsInfoParam;
import com.czg.product.param.ConsReportDamageParam;
import com.czg.product.param.ConsSubUnitParam; import com.czg.product.param.ConsSubUnitParam;
import com.czg.product.service.ConsInfoService; import com.czg.product.service.ConsInfoService;
import com.czg.product.vo.ConsStatisticsVo; import com.czg.product.vo.ConsStatisticsVo;
@ -181,4 +182,5 @@ public class ConsInfoController {
ConsStatisticsVo data = consInfoService.statistics(param); ConsStatisticsVo data = consInfoService.statistics(param);
return CzgResult.success(data); return CzgResult.success(data);
} }
}
}

View File

@ -1,9 +1,15 @@
package com.czg.controller.admin; package com.czg.controller.admin;
import com.czg.log.annotation.OperationLog; import com.czg.log.annotation.OperationLog;
import com.czg.product.dto.ShopVendorBillPayDTO;
import com.czg.product.dto.ShopVendorDTO; import com.czg.product.dto.ShopVendorDTO;
import com.czg.product.service.ShopVendorService; import com.czg.product.service.ShopVendorService;
import com.czg.product.vo.ShopVendorBillPayRecordVO;
import com.czg.product.vo.ShopVendorBillRecordVO;
import com.czg.product.vo.ShopVendorBillVO;
import com.czg.product.vo.ShopVendorSummaryVO;
import com.czg.resp.CzgResult; import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.utils.AssertUtil; import com.czg.utils.AssertUtil;
import com.czg.validator.group.DefaultGroup; import com.czg.validator.group.DefaultGroup;
import com.czg.validator.group.InsertGroup; import com.czg.validator.group.InsertGroup;
@ -98,4 +104,57 @@ public class ShopVendorController {
shopVendorService.deleteShopVendor(id); shopVendorService.deleteShopVendor(id);
return CzgResult.success(); return CzgResult.success();
} }
}
/**
* 供应商账单统计
* @return 统计信息
*/
@GetMapping("summary")
@OperationLog("供应商账单-统计")
public CzgResult<ShopVendorSummaryVO> summary() {
return CzgResult.success(shopVendorService.summary(StpKit.USER.getShopId()));
}
/**
* 账单列表
* @return 账单列表
*/
@GetMapping("/bill")
@OperationLog("供应商账单-列表")
public CzgResult<Page<ShopVendorBillVO>> bill() {
return CzgResult.success(shopVendorService.billList(StpKit.USER.getShopId()));
}
/**
* 账单记录
* @return 记录list
*/
@GetMapping("/bill/record")
@OperationLog("供应商账单-列表")
public CzgResult<Page<ShopVendorBillRecordVO>> bill(@RequestParam Integer vendorId) {
return CzgResult.success(shopVendorService.billRecord(StpKit.USER.getShopId(), vendorId));
}
/**
* 账单支付
* @return 记录list
*/
@PostMapping("/bill/pay")
@OperationLog("供应商账单-付款")
public CzgResult<Boolean> pay(@RequestBody @Validated ShopVendorBillPayDTO payDTO) {
return CzgResult.success(shopVendorService.pay(StpKit.USER.getShopId(), payDTO));
}
/**
* 账单支付记录
* @return 记录list
*/
@GetMapping("/bill/pay/record")
@OperationLog("供应商账单-付款记录")
public CzgResult<Page<ShopVendorBillPayRecordVO>> payRecord(@RequestParam Long flowId) {
return CzgResult.success(shopVendorService.payRecord(StpKit.USER.getShopId(), flowId));
}
}

View File

@ -41,4 +41,6 @@ public class ShopStaffPagePermission implements Serializable {
*/ */
private Long pagePathId; private Long pagePathId;
private Integer isUse;
} }

View File

@ -3,6 +3,8 @@ package com.czg.account.service;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
import com.czg.account.entity.ShopPagePath; import com.czg.account.entity.ShopPagePath;
import java.util.List;
/** /**
* 服务层 * 服务层
* *
@ -11,4 +13,5 @@ import com.czg.account.entity.ShopPagePath;
*/ */
public interface ShopPagePathService extends IService<ShopPagePath> { public interface ShopPagePathService extends IService<ShopPagePath> {
List<ShopPagePath> detail(Long staffId);
} }

View File

@ -0,0 +1,70 @@
package com.czg.product.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 耗材付款记录 实体类
*
* @author zs
* @since 2025-04-03
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConsPayRecordDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 供应商id
*/
private Long vendorId;
/**
* 出入库id
*/
private Long flowId;
/**
* 付款金额
*/
private BigDecimal amount;
/**
* 付款方式 支付宝 微信 银行卡 现金
*/
private String type;
/**
* 付款备注
*/
private String remark;
/**
* 操作员工id
*/
private Long userId;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,40 @@
package com.czg.product.dto;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 供应商
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-20
*/
@Data
public class ShopVendorBillPayDTO {
/**
* 账单记录id
*/
@NotEmpty(message = "账单记录id不能为空")
private List<Long> flowIdList;
/**
* 付款金额
*/
@DecimalMin(value = "0.01", message = "付款金额不能小于0.01")
private BigDecimal amount;
/**
* 付款类型
*/
@NotBlank(message = "付款类型不能为空")
private String type;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,80 @@
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 java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 耗材付款记录 实体类
*
* @author zs
* @since 2025-04-03
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_cons_pay_record")
@Accessors(chain = true)
public class ConsPayRecord implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 供应商id
*/
private Long vendorId;
/**
* 出入库id
*/
private Long flowId;
/**
* 付款金额
*/
private BigDecimal amount;
/**
* 付款方式 支付宝 微信 银行卡 现金
*/
private String type;
/**
* 付款备注
*/
private String remark;
/**
* 操作员工id
*/
private Long userId;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,17 @@
package com.czg.product.service;
import com.czg.product.vo.ShopVendorBillPayRecordVO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.product.entity.ConsPayRecord;
/**
* 耗材付款记录 服务层
*
* @author zs
* @since 2025-04-03
*/
public interface ConsPayRecordService extends IService<ConsPayRecord> {
Page<ShopVendorBillPayRecordVO> getByFlowId(Long shopId, Long flowId);
}

View File

@ -1,7 +1,12 @@
package com.czg.product.service; package com.czg.product.service;
import com.czg.product.dto.ShopVendorBillPayDTO;
import com.czg.product.dto.ShopVendorDTO; import com.czg.product.dto.ShopVendorDTO;
import com.czg.product.entity.ShopVendor; import com.czg.product.entity.ShopVendor;
import com.czg.product.vo.ShopVendorBillPayRecordVO;
import com.czg.product.vo.ShopVendorBillRecordVO;
import com.czg.product.vo.ShopVendorBillVO;
import com.czg.product.vo.ShopVendorSummaryVO;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
@ -57,4 +62,33 @@ public interface ShopVendorService extends IService<ShopVendor> {
*/ */
void deleteShopVendor(Long id); void deleteShopVendor(Long id);
} ShopVendorSummaryVO summary(Long shopId);
/**
* 账单列表
*
* @param shopId 店铺id
* @return 账单
*/
Page<ShopVendorBillVO> billList(Long shopId);
/**
* 账单记录明细
*
* @param shopId 店铺id
* @param vendorId 供应商id
* @return 分页
*/
Page<ShopVendorBillRecordVO> billRecord(Long shopId, Integer vendorId);
/**
* 账单付款
* @param shopId 店铺id
* @param payDTO 数据
* @return 是否成功
*/
Boolean pay(Long shopId, ShopVendorBillPayDTO payDTO);
Page<ShopVendorBillPayRecordVO> payRecord(Long shopId, Long flowId);
}

View File

@ -0,0 +1,55 @@
package com.czg.product.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author Administrator
*/
@Data
public class ShopVendorBillPayRecordVO {
/**
* 付款id
*/
private Long id;
/**
* 耗材名称
*/
private String conName;
/**
* 单价
*/
private BigDecimal purchasePrice;
/**
* 数量
*/
private BigDecimal inOutNumber;
/**
* 付款金额
*/
private BigDecimal amount;
/**
* 付款方式
*/
private String type;
/**
* 备注
*/
private String remark;
/**
* 操作账号
*/
private String account;
/**
* 账号昵称
*/
private String nickname;
/**
* 编码
*/
private String code;
private LocalDateTime createTime;
}

View File

@ -0,0 +1,50 @@
package com.czg.product.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author Administrator
*/
@Data
public class ShopVendorBillRecordVO {
/**
* 记录id
*/
private Long id;
/**
* 耗材名称
*/
private String conName;
/**
* 单价
*/
private BigDecimal purchasePrice;
/**
* 数量
*/
private BigDecimal inOutNumber;
/**
* 应付
*/
private BigDecimal amountPayable;
/**
* 已付
*/
private BigDecimal actualPaymentAmount;
/**
* 待付
*/
private BigDecimal unPaidAmount;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private LocalDateTime createTime;
}

View File

@ -0,0 +1,37 @@
package com.czg.product.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author Administrator
*/
@Data
public class ShopVendorBillVO {
/**
* 供应商名称
*/
private String name;
/**
* 供应商id
*/
private Long vendorId;
/**
* 账单金额
*/
private BigDecimal amountPayable;
/**
* 已付款金额
*/
private BigDecimal actualPaymentAmount;
/**
* 未付款金额
*/
private BigDecimal unPaidAmount;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,38 @@
package com.czg.product.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author Administrator
*/
@Data
public class ShopVendorSummaryVO {
/**
* 全部总金额
*/
private BigDecimal amountPayable = BigDecimal.ZERO;
/**
* 当月总金额
*/
private BigDecimal mouthAmountPayable = BigDecimal.ZERO;
/**
* 全部支付金额
*/
private BigDecimal actualPaymentAmount = BigDecimal.ZERO;
/**
* 当月支付金额
*/
private BigDecimal mouthActualPaymentAmount = BigDecimal.ZERO;
/**
* 待支付金额
*/
private BigDecimal unPaidAmount = BigDecimal.ZERO;
/**
* 本月待支付金额
*/
private BigDecimal mouthUnPaidAmount = BigDecimal.ZERO;
}

View File

@ -147,6 +147,11 @@ public class JoinQueryWrapper extends QueryWrapper {
return this; return this;
} }
@Override
public <T> QueryWrapper groupBy(LambdaGetter<T> column) {
return super.groupBy(getColum(column));
}
@Override @Override
public <T> JoinQueryWrapper like(LambdaGetter<T> column, Object value) { public <T> JoinQueryWrapper like(LambdaGetter<T> column, Object value) {
like(getColum(column), value); like(getColum(column), value);

View File

@ -4,6 +4,9 @@ import com.czg.account.dto.pad.PadProductCategoryDTO;
import com.mybatisflex.core.BaseMapper; import com.mybatisflex.core.BaseMapper;
import com.czg.account.entity.PadProductCategoryDetail; import com.czg.account.entity.PadProductCategoryDetail;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* Pad商品自定义分类明细 映射层 * Pad商品自定义分类明细 映射层
@ -12,6 +15,5 @@ import com.mybatisflex.core.paginate.Page;
* @since 2025-02-20 * @since 2025-02-20
*/ */
public interface PadProductCategoryDetailMapper extends BaseMapper<PadProductCategoryDetail> { public interface PadProductCategoryDetailMapper extends BaseMapper<PadProductCategoryDetail> {
Page<PadProductCategoryDTO> selectPageByKeyAndShopId(); List<PadProductCategoryDTO> selectPageByKeyAndShopId(@Param("shopId") Long shopId, @Param("categoryId") Long categoryId);
long selectPageByKeyAndShopId_COUNT();
} }

View File

@ -8,6 +8,9 @@ import com.czg.product.entity.Product;
import com.czg.product.service.ProductService; import com.czg.product.service.ProductService;
import com.czg.service.account.mapper.PadProductCategoryDetailMapper; import com.czg.service.account.mapper.PadProductCategoryDetailMapper;
import com.czg.utils.JoinQueryWrapper; import com.czg.utils.JoinQueryWrapper;
import com.czg.utils.PageUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -37,12 +40,8 @@ public class PadProdServiceImpl implements PadProdService {
@Override @Override
public Page<PadProductCategoryDTO> pageInfo(Page<PadProductCategoryDTO> objectPage, Long productCategoryId, Long shopId) { public Page<PadProductCategoryDTO> pageInfo(Page<PadProductCategoryDTO> objectPage, Long productCategoryId, Long shopId) {
JoinQueryWrapper queryWrapper = new JoinQueryWrapper().eq(PadProductCategory::getShopId, shopId); PageHelper.startPage(PageUtil.buildPageHelp());
if (productCategoryId != null) { return PageUtil.convert(new PageInfo<>(padProductCategoryDetailMapper.selectPageByKeyAndShopId(shopId, productCategoryId)));
queryWrapper.eq(PadProductCategory::getProductCategoryId, productCategoryId);
}
queryWrapper.orderBy(PadProductCategory::getSort, true).orderBy(PadProductCategory::getId, false);
return padProductCategoryDetailMapper.xmlPaginate("selectPageByKeyAndShopId", objectPage, queryWrapper);
} }
@Override @Override

View File

@ -1,10 +1,25 @@
package com.czg.service.account.service.impl; package com.czg.service.account.service.impl;
import com.czg.account.entity.ShopStaffPagePermission;
import com.czg.account.service.ShopStaffPagePermissionService;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.service.account.mapper.ShopStaffPagePermissionMapper;
import com.czg.service.account.mapper.ShopStaffPermissionMapper;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl; import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.account.entity.ShopPagePath; import com.czg.account.entity.ShopPagePath;
import com.czg.account.service.ShopPagePathService; import com.czg.account.service.ShopPagePathService;
import com.czg.service.account.mapper.ShopPagePathMapper; import com.czg.service.account.mapper.ShopPagePathMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* 服务层实现 * 服务层实现
@ -14,5 +29,26 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class ShopPagePathServiceImpl extends ServiceImpl<ShopPagePathMapper, ShopPagePath> implements ShopPagePathService{ public class ShopPagePathServiceImpl extends ServiceImpl<ShopPagePathMapper, ShopPagePath> implements ShopPagePathService{
@Resource
private ShopStaffPagePermissionMapper shopStaffPagePermissionMapper;
@Override
public List<ShopPagePath> detail(Long staffId) {
List<ShopStaffPagePermission> shopStaffPagePermissions = shopStaffPagePermissionMapper.selectListByQuery(new QueryWrapper().eq(ShopStaffPagePermission::getShopId,
StpKit.USER.getShopId()).eq(ShopStaffPagePermission::getStaffId, staffId));
if (shopStaffPagePermissions.isEmpty()) {
list().forEach(item -> {
ShopStaffPagePermission permission = new ShopStaffPagePermission();
permission.setShopId(StpKit.USER.getShopId());
permission.setStaffId(staffId);
permission.setPagePathId(item.getId());
permission.setIsUse(1);
shopStaffPagePermissionMapper.insert(permission);
});
return list();
}
Set<Long> pageIdList = shopStaffPagePermissions.stream().filter(item -> item.getIsUse() == 1).map(ShopStaffPagePermission::getPagePathId).collect(Collectors.toSet());
return pageIdList.isEmpty() ? new ArrayList<>() : list(new QueryWrapper().in(ShopPagePath::getId, pageIdList));
}
} }

View File

@ -16,6 +16,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/** /**
* 服务层实现 * 服务层实现
@ -38,24 +42,36 @@ public class ShopStaffPagePermissionServiceImpl extends ServiceImpl<ShopStaffPag
throw new ApiNotPrintException("员工不存在"); throw new ApiNotPrintException("员工不存在");
} }
long count = shopPagePathService.count(new QueryWrapper().in(ShopPagePath::getId, pagePathPermissionAddDTO.getPagePathIdList())); if (!pagePathPermissionAddDTO.getPagePathIdList().isEmpty()) {
if (count != pagePathPermissionAddDTO.getPagePathIdList().size()) { long count = shopPagePathService.count(new QueryWrapper().in(ShopPagePath::getId, pagePathPermissionAddDTO.getPagePathIdList()));
throw new ApiNotPrintException("存在错误id"); if (count != pagePathPermissionAddDTO.getPagePathIdList().size()) {
throw new ApiNotPrintException("存在错误id");
}
} }
ArrayList<ShopStaffPagePermission> pagePermissions = new ArrayList<>(); Map<Long, ShopStaffPagePermission> map = list(new QueryWrapper().eq(ShopStaffPagePermission::getStaffId,
remove(new QueryWrapper().eq(ShopStaffPagePermission::getStaffId, pagePathPermissionAddDTO.getStaffId())); pagePathPermissionAddDTO.getStaffId())).stream().collect(Collectors.toMap(ShopStaffPagePermission::getPagePathId, item -> item));
pagePathPermissionAddDTO.getPagePathIdList().forEach(item -> { pagePathPermissionAddDTO.getPagePathIdList().forEach(item -> {
long count1 = count(new QueryWrapper().eq(ShopStaffPagePermission::getStaffId, shopStaff).eq(ShopStaffPagePermission::getPagePathId, item)); ShopStaffPagePermission permission1 = map.get(item);
if (count1 > 0) { if (permission1 == null) {
return; ShopStaffPagePermission permission = new ShopStaffPagePermission();
permission.setShopId(shopId);
permission.setPagePathId(item);
permission.setStaffId(pagePathPermissionAddDTO.getStaffId());
permission.setIsUse(1);
save(permission);
}else {
permission1.setIsUse(1);
updateById(permission1);
map.remove(item);
} }
ShopStaffPagePermission permission = new ShopStaffPagePermission();
permission.setShopId(shopId);
permission.setPagePathId(item);
permission.setStaffId(pagePathPermissionAddDTO.getStaffId());
pagePermissions.add(permission);
}); });
return saveBatch(pagePermissions); Set<Long> collect = map.values().stream().map(ShopStaffPagePermission::getId).collect(Collectors.toSet());
if (!collect.isEmpty()) {
updateChain().set(ShopStaffPagePermission::getIsUse, 0).in(ShopStaffPagePermission::getId, collect).update();
}
return true;
} }
} }

View File

@ -102,14 +102,16 @@ public class ShopStaffServiceImpl extends ServiceImpl<ShopStaffMapper, ShopStaff
BeanUtil.copyProperties(shopStaffEditDTO, shopStaff); BeanUtil.copyProperties(shopStaffEditDTO, shopStaff);
updateById(shopStaff); updateById(shopStaff);
if (shopStaffEditDTO.getShopPermissionIds() != null && !shopStaffEditDTO.getShopPermissionIds().isEmpty()) { if (shopStaffEditDTO.getShopPermissionIds() != null ) {
shopStaffPermissionService.updateChain().eq(ShopStaffPermission::getStaffId, shopStaff.getId()) shopStaffPermissionService.updateChain().eq(ShopStaffPermission::getStaffId, shopStaff.getId())
.eq(ShopStaffPermission::getShopId, StpKit.USER.getShopId()).eq(ShopStaffPermission::getUserId, shopStaff.getId()).remove(); .eq(ShopStaffPermission::getShopId, StpKit.USER.getShopId()).eq(ShopStaffPermission::getUserId, shopStaff.getId()).remove();
// 权限添加 // 权限添加
addPermission(shopStaff, shopStaffEditDTO.getShopPermissionIds()); if (!shopStaffEditDTO.getShopPermissionIds().isEmpty()) {
addPermission(shopStaff, shopStaffEditDTO.getShopPermissionIds());
}
} }
if (shopStaffEditDTO.getPagePathIdList() != null && !shopStaffEditDTO.getPagePathIdList().isEmpty()) { if (shopStaffEditDTO.getPagePathIdList() != null) {
PagePathPermissionAddDTO pagePathPermissionAddDTO = new PagePathPermissionAddDTO(); PagePathPermissionAddDTO pagePathPermissionAddDTO = new PagePathPermissionAddDTO();
pagePathPermissionAddDTO.setPagePathIdList(shopStaffEditDTO.getPagePathIdList()); pagePathPermissionAddDTO.setPagePathIdList(shopStaffEditDTO.getPagePathIdList());
pagePathPermissionAddDTO.setStaffId(shopStaff.getId()); pagePathPermissionAddDTO.setStaffId(shopStaff.getId());

View File

@ -17,18 +17,12 @@
ON tb_pad_product_category.product_category_id = tb_shop_prod_category.id ON tb_pad_product_category.product_category_id = tb_shop_prod_category.id
LEFT JOIN tb_product ON tb_pad_product_category_detail.product_id = tb_product.id LEFT JOIN tb_product ON tb_pad_product_category_detail.product_id = tb_product.id
LEFT JOIN tb_pad_layout ON tb_pad_product_category.pad_layout_id = tb_pad_layout.id LEFT JOIN tb_pad_layout ON tb_pad_product_category.pad_layout_id = tb_pad_layout.id
${qwSql} where tb_pad_product_category.shop_id=#{shopId}
limit ${pageOffset}, ${pageSize} <if test="categoryId != null">
</select> and tb_pad_product_category.product_category_id=#{categoryId}
<select id="selectPageByKeyAndShopId_COUNT" resultType="java.lang.Long"> </if>
SELECT count(1) group by tb_pad_product_category.id
FROM tb_pad_product_category order by tb_pad_product_category.sort desc
LEFT JOIN tb_pad_product_category_detail
ON tb_pad_product_category.id = tb_pad_product_category_detail.pad_product_category_id
LEFT JOIN tb_shop_prod_category
ON tb_pad_product_category.product_category_id = tb_shop_prod_category.id
LEFT JOIN tb_product ON tb_pad_product_category_detail.product_id = tb_product.id
LEFT JOIN tb_pad_layout ON tb_pad_product_category.pad_layout_id = tb_pad_layout.id
${qwSql}
</select> </select>
</mapper> </mapper>

View File

@ -0,0 +1,18 @@
package com.czg.service.product.mapper;
import com.czg.product.vo.ShopVendorBillPayRecordVO;
import com.mybatisflex.core.BaseMapper;
import com.czg.product.entity.ConsPayRecord;
import java.util.List;
/**
* 耗材付款记录 映射层
*
* @author zs
* @since 2025-04-03
*/
public interface ConsPayRecordMapper extends BaseMapper<ConsPayRecord> {
List<ShopVendorBillPayRecordVO> selectByFlowId(Long shopId, Long flowId);
}

View File

@ -3,8 +3,13 @@ package com.czg.service.product.mapper;
import com.czg.product.entity.ConsStockFlow; import com.czg.product.entity.ConsStockFlow;
import com.czg.product.param.ConsInfoParam; import com.czg.product.param.ConsInfoParam;
import com.czg.product.vo.ConsStatisticsVo; import com.czg.product.vo.ConsStatisticsVo;
import com.czg.product.vo.ShopVendorBillRecordVO;
import com.mybatisflex.core.BaseMapper; import com.mybatisflex.core.BaseMapper;
import jakarta.validation.constraints.NotEmpty;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 耗材库存变动记录 * 耗材库存变动记录
@ -15,4 +20,8 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface ConsStockFlowMapper extends BaseMapper<ConsStockFlow> { public interface ConsStockFlowMapper extends BaseMapper<ConsStockFlow> {
ConsStatisticsVo getConsStatistics(ConsInfoParam param); ConsStatisticsVo getConsStatistics(ConsInfoParam param);
}
List<ShopVendorBillRecordVO> selectByVendorId(@Param("shopId") Long shopId, @Param("vendorId") Integer vendorId);
List<ConsStockFlow> selectUnPaid(@Param("shopId") Long shopId, @Param("vendorIds") @NotEmpty List<Long> vendorIds);
}

View File

@ -1,8 +1,13 @@
package com.czg.service.product.mapper; package com.czg.service.product.mapper;
import com.czg.product.entity.ShopVendor; import com.czg.product.entity.ShopVendor;
import com.czg.product.vo.ShopVendorBillVO;
import com.czg.product.vo.ShopVendorSummaryVO;
import com.mybatisflex.core.BaseMapper; import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 供应商 * 供应商
@ -13,4 +18,8 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface ShopVendorMapper extends BaseMapper<ShopVendor> { public interface ShopVendorMapper extends BaseMapper<ShopVendor> {
} ShopVendorSummaryVO summary(@Param("shopId") Long shopId);
List<ShopVendorBillVO> bill(@Param("shopId") Long shopId);
}

View File

@ -0,0 +1,28 @@
package com.czg.service.product.service.impl;
import com.czg.product.vo.ShopVendorBillPayRecordVO;
import com.czg.utils.PageUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.product.entity.ConsPayRecord;
import com.czg.product.service.ConsPayRecordService;
import com.czg.service.product.mapper.ConsPayRecordMapper;
import org.springframework.stereotype.Service;
/**
* 耗材付款记录 服务层实现
*
* @author zs
* @since 2025-04-03
*/
@Service
public class ConsPayRecordServiceImpl extends ServiceImpl<ConsPayRecordMapper, ConsPayRecord> implements ConsPayRecordService{
@Override
public Page<ShopVendorBillPayRecordVO> getByFlowId(Long shopId, Long flowId) {
PageHelper.startPage(PageUtil.buildPageHelp());
return PageUtil.convert(new PageInfo<>(mapper.selectByFlowId(shopId, flowId)));
}
}

View File

@ -1,21 +1,38 @@
package com.czg.service.product.service.impl; package com.czg.service.product.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.czg.enums.DeleteEnum; import com.czg.enums.DeleteEnum;
import com.czg.exception.ApiNotPrintException;
import com.czg.exception.CzgException; import com.czg.exception.CzgException;
import com.czg.product.dto.ShopVendorBillPayDTO;
import com.czg.product.dto.ShopVendorDTO; import com.czg.product.dto.ShopVendorDTO;
import com.czg.product.entity.ConsPayRecord;
import com.czg.product.entity.ConsStockFlow;
import com.czg.product.entity.ShopVendor; import com.czg.product.entity.ShopVendor;
import com.czg.product.service.ConsPayRecordService;
import com.czg.product.service.ConsStockFlowService;
import com.czg.product.service.ShopVendorService; import com.czg.product.service.ShopVendorService;
import com.czg.product.vo.ShopVendorBillPayRecordVO;
import com.czg.product.vo.ShopVendorBillRecordVO;
import com.czg.product.vo.ShopVendorBillVO;
import com.czg.product.vo.ShopVendorSummaryVO;
import com.czg.sa.StpKit; import com.czg.sa.StpKit;
import com.czg.service.product.mapper.ConsStockFlowMapper;
import com.czg.service.product.mapper.ShopVendorMapper; import com.czg.service.product.mapper.ShopVendorMapper;
import com.czg.utils.PageUtil; import com.czg.utils.PageUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain; import com.mybatisflex.core.update.UpdateChain;
import com.mybatisflex.spring.service.impl.ServiceImpl; import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -26,6 +43,12 @@ import java.util.List;
*/ */
@Service @Service
public class ShopVendorServiceImpl extends ServiceImpl<ShopVendorMapper, ShopVendor> implements ShopVendorService { public class ShopVendorServiceImpl extends ServiceImpl<ShopVendorMapper, ShopVendor> implements ShopVendorService {
@Resource
private ConsStockFlowMapper consStockFlowMapper;
@Resource
private ConsStockFlowService consStockFlowService;
@Resource
private ConsPayRecordService consPayRecordService;
private QueryWrapper buildQueryWrapper(ShopVendorDTO param) { private QueryWrapper buildQueryWrapper(ShopVendorDTO param) {
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
@ -93,4 +116,73 @@ public class ShopVendorServiceImpl extends ServiceImpl<ShopVendorMapper, ShopVen
.update(); .update();
} }
} @Override
public ShopVendorSummaryVO summary(Long shopId) {
return mapper.summary(shopId);
}
@Override
public Page<ShopVendorBillVO> billList(Long shopId) {
PageHelper.startPage(PageUtil.buildPageHelp());
return PageUtil.convert(new PageInfo<>(mapper.bill(shopId)));
}
@Override
public Page<ShopVendorBillRecordVO> billRecord(Long shopId, Integer vendorId) {
PageHelper.startPage(PageUtil.buildPageHelp());
return PageUtil.convert(new PageInfo<>(consStockFlowMapper.selectByVendorId(shopId, vendorId)));
}
@Override
public Boolean pay(Long shopId, ShopVendorBillPayDTO payDTO) {
// 批量付款
if (payDTO.getFlowIdList().size() > 1) {
List<ConsStockFlow> stockFlows = consStockFlowMapper.selectUnPaid(shopId, payDTO.getFlowIdList());
BigDecimal unPaidAmount = BigDecimal.ZERO;
ArrayList<ConsPayRecord> records = new ArrayList<>();
for (ConsStockFlow item : stockFlows) {
unPaidAmount = unPaidAmount.add(item.getAmountPayable().subtract(item.getActualPaymentAmount()));
item.setActualPaymentAmount(item.getAmountPayable());
records.add(new ConsPayRecord().setShopId(shopId).setVendorId(item.getVendorId()).setType(payDTO.getType())
.setAmount(item.getAmountPayable().subtract(item.getActualPaymentAmount()))
.setFlowId(item.getId()).setUserId(StpKit.USER.getLoginIdAsLong()).setCreateTime(DateUtil.date().toLocalDateTime()));
}
if (unPaidAmount.compareTo(payDTO.getAmount()) != 0) {
throw new ApiNotPrintException("批量付款应全部付款");
}
consPayRecordService.saveBatch(records);
return consStockFlowService.updateBatch(stockFlows);
}else {
ConsStockFlow stockFlow = consStockFlowMapper.selectOneByQuery(new QueryWrapper().eq(ConsStockFlow::getShopId, shopId).eq(ConsStockFlow::getId, payDTO.getFlowIdList().getFirst()));
if (stockFlow == null) {
throw new ApiNotPrintException("付款账单不存在");
}
if (stockFlow.getAmountPayable().compareTo(stockFlow.getActualPaymentAmount()) <= 0) {
throw new ApiNotPrintException("次账单已付款完成");
}
if (payDTO.getAmount().compareTo(stockFlow.getAmountPayable().subtract(stockFlow.getActualPaymentAmount())) > 0) {
throw new ApiNotPrintException("付款金额不应超过待付款金额");
}
ConsPayRecord consPayRecord = BeanUtil.copyProperties(payDTO, ConsPayRecord.class);
consPayRecord.setShopId(shopId);
consPayRecord.setVendorId(stockFlow.getVendorId());
consPayRecord.setFlowId(payDTO.getFlowIdList().getFirst());
consPayRecord.setUserId(StpKit.USER.getLoginIdAsLong());
consPayRecordService.save(consPayRecord);
stockFlow.setActualPaymentAmount(stockFlow.getActualPaymentAmount().add(payDTO.getAmount()));
return consStockFlowMapper.update(stockFlow) > 0;
}
}
@Override
public Page<ShopVendorBillPayRecordVO> payRecord(Long shopId, Long flowId) {
return consPayRecordService.getByFlowId(shopId, flowId);
}
}

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.product.mapper.ConsPayRecordMapper">
<select id="selectByFlowId" resultType="com.czg.product.vo.ShopVendorBillPayRecordVO">
select a.*, b.con_name, b.purchase_price, b.in_out_number, c.account, c.nick_name, c.id
from tb_cons_pay_record as a
left join tb_cons_stock_flow as b on a.flow_id = b.id
left join sys_user as c on c.id = a.user_id
where a.flow_id = #{flowId} and a.shop_id=#{shopId}
</select>
</mapper>

View File

@ -5,16 +5,16 @@
<select id="getConsStatistics" resultType="com.czg.product.vo.ConsStatisticsVo"> <select id="getConsStatistics" resultType="com.czg.product.vo.ConsStatisticsVo">
SELECT SELECT
sum( CASE WHEN t1.in_out_type = 'in' then t1.in_out_number end) AS inSumTotal, sum( CASE WHEN t1.in_out_type = 'in' then t1.in_out_number end) AS inSumTotal,
sum( CASE WHEN t1.in_out_item = 'win-in' THEN t1.in_out_number END ) AS winInNum, sum( CASE WHEN t1.in_out_item = 'win-in' THEN t1.in_out_number END ) AS winInNum,
sum( CASE WHEN t1.in_out_item = 'manual-in' THEN t1.in_out_number END ) AS stockInNum, sum( CASE WHEN t1.in_out_item = 'manual-in' THEN t1.in_out_number END ) AS stockInNum,
sum( CASE WHEN t1.in_out_type = 'out' then abs(t1.in_out_number) end) AS outSumTotal, sum( CASE WHEN t1.in_out_type = 'out' then abs(t1.in_out_number) end) AS outSumTotal,
sum( CASE WHEN t1.in_out_item = 'loss-out' THEN abs(t1.in_out_number) END ) AS lossOutNum, sum( CASE WHEN t1.in_out_item = 'loss-out' THEN abs(t1.in_out_number) END ) AS lossOutNum,
abs(sum( CASE WHEN t1.in_out_item = 'order-out' THEN t1.in_out_number END )) AS consumeNum, abs(sum( CASE WHEN t1.in_out_item = 'order-out' THEN t1.in_out_number END )) AS consumeNum,
sum( CASE WHEN t1.in_out_item = 'damage-out' THEN abs(t1.in_out_number) END ) AS damageNum, sum( CASE WHEN t1.in_out_item = 'damage-out' THEN abs(t1.in_out_number) END ) AS damageNum,
sum( CASE WHEN t1.in_out_item = 'manual-out' THEN abs(t1.in_out_number) END ) AS stockOutNum sum( CASE WHEN t1.in_out_item = 'manual-out' THEN abs(t1.in_out_number) END ) AS stockOutNum
FROM FROM
tb_cons_stock_flow t1 tb_cons_stock_flow t1
LEFT JOIN tb_cons_info t2 on t1.con_id = t2.id LEFT JOIN tb_cons_info t2 on t1.con_id = t2.id
where t1.shop_id = #{shopId} where t1.shop_id = #{shopId}
<if test="id != null"> <if test="id != null">
@ -35,4 +35,25 @@
]]> ]]>
</if> </if>
</select> </select>
</mapper> <select id="selectByVendorId" resultType="com.czg.product.vo.ShopVendorBillRecordVO">
SELECT id,
con_name,
purchase_price,
in_out_number,
amount_payable,
actual_payment_amount,
remark,
create_time,
(amount_payable - actual_payment_amount) as unPaidAmount
FROM tb_cons_stock_flow
WHERE shop_id = #{shopId}
and vendor_id = #{vendorId}
</select>
<select id="selectUnPaid" resultType="com.czg.product.entity.ConsStockFlow">
select * from tb_cons_stock_flow where amount_payable > actual_payment_amount and shop_id=#{shopId}
<foreach collection="vendorIds" item="id" open="and vendor_id in (" separator=",">
#{id}
</foreach>
</select>
</mapper>

View File

@ -3,4 +3,34 @@
<mapper namespace="com.czg.service.product.mapper.ShopVendorMapper"> <mapper namespace="com.czg.service.product.mapper.ShopVendorMapper">
</mapper> <select id="summary" resultType="com.czg.product.vo.ShopVendorSummaryVO">
SELECT vendor_id,
sum(amount_payable) AS amountPayable,
sum(CASE
WHEN create_time BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND LAST_DAY(NOW())
THEN amount_payable END) AS mouthAmountPayable,
sum(actual_payment_amount) AS actualPaymentAmount,
sum(CASE
WHEN create_time BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND LAST_DAY(NOW())
THEN actual_payment_amount END) AS mouthActualPaymentAmount,
sum(amount_payable - actual_payment_amount) AS unPaidAmount,
sum(CASE
WHEN create_time BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND LAST_DAY(NOW())
THEN amount_payable - actual_payment_amount END) AS mouthUnPaidAmount,
remark
FROM tb_cons_stock_flow
WHERE shop_id = #{shopId}
</select>
<select id="bill" resultType="com.czg.product.vo.ShopVendorBillVO">
select tb_cons_stock_flow.vendor_id as vendorId,
tb_shop_vendor.`name`,
sum(tb_cons_stock_flow.amount_payable) as amountPayable,
sum(tb_cons_stock_flow.actual_payment_amount) as actualPaymentAmount,
sum(tb_cons_stock_flow.amount_payable) - sum(tb_cons_stock_flow.actual_payment_amount) as unPaidAmount,
tb_cons_stock_flow.remark
from tb_cons_stock_flow
left join tb_shop_vendor on tb_cons_stock_flow.vendor_id = tb_shop_vendor.id
where tb_cons_stock_flow.shop_id = #{shopId}
GROUP BY tb_cons_stock_flow.vendor_id
</select>
</mapper>

1
sqls/250403/cash.sql Normal file
View File

@ -0,0 +1 @@
ALTER TABLE `tb_shop_info` ADD COLUMN `is_head_shop` tinyint NULL COMMENT '是否主店 1-是 0-否';