guoshuai 1 týždeň pred
rodič
commit
6277f19939

+ 125 - 0
src/main/java/com/qmrb/system/controller/InvoiceTitleController.java

@@ -0,0 +1,125 @@
+package com.qmrb.system.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.qmrb.system.framework.security.util.SecurityUtils;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.common.result.PageResult;
+import com.qmrb.system.common.result.Result;
+import com.qmrb.system.common.result.ResultCode;
+import com.qmrb.system.framework.resubmit.Resubmit;
+import com.qmrb.system.service.IInvoiceTitleService;
+import com.qmrb.system.pojo.form.InvoiceTitleForm;
+import com.qmrb.system.pojo.vo.InvoiceTitleVO;
+import com.qmrb.system.pojo.query.InvoiceTitleQuery;
+import com.qmrb.system.pojo.vo.Option;
+
+import cn.hutool.core.util.StrUtil;
+import org.springframework.web.bind.annotation.RestController;
+import jakarta.validation.Valid;
+
+/**
+ * <p>
+ * 发票抬头表 前端控制器
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Tag(name = "发票抬头表接口")
+@RestController
+@RequestMapping("/api/v1/title")
+@CrossOrigin
+public class InvoiceTitleController{
+
+    @Autowired
+    private IInvoiceTitleService invoiceTitleService;
+
+	@Operation(summary = "发票抬头表分页列表", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/page")
+    public PageResult<InvoiceTitleVO> getPage(
+            @ParameterObject InvoiceTitleQuery queryParams
+    ) {
+        Page<InvoiceTitleVO> result = invoiceTitleService.getPage(queryParams);
+        return PageResult.success(result);
+    }
+    
+    @Operation(summary = "发票抬头表分页列表", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/getInvoiceTitles")
+    public PageResult<InvoiceTitleVO> getInvoiceTitles(
+            @ParameterObject InvoiceTitleQuery queryParams
+    ) {
+        if(SecurityUtils.getUserId() == null){
+            return PageResult.success(null);
+        }
+        queryParams.setUserId(SecurityUtils.getUserId());
+        Page<InvoiceTitleVO> result = invoiceTitleService.getPage(queryParams);
+        return PageResult.success(result);
+    }
+    
+    @Operation(summary = "新增发票抬头表", security = {@SecurityRequirement(name = "Authorization")})
+    @PostMapping
+    @Resubmit
+    public Result<InvoiceTitleForm> saveForm(
+            @RequestBody @Valid InvoiceTitleForm form
+    ) {
+        InvoiceTitleForm result = invoiceTitleService.saveForm(form);
+        return Result.success(result);
+    }
+
+    @Operation(summary = "发票抬头表表单数据", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/{id}/form")
+    public Result<InvoiceTitleForm> getForm(
+            @Parameter(description = "发票抬头表ID") @PathVariable Long id
+    ) {
+    	InvoiceTitleForm formData = invoiceTitleService.getFormData(id);
+        return Result.success(formData);
+    }
+
+    @Operation(summary = "修改发票抬头表", security = {@SecurityRequirement(name = "Authorization")})
+    @PutMapping(value = "/{id}")
+    public Result<?> updateForm(
+            @Parameter(description = "发票抬头表ID") @PathVariable Long id,
+            @RequestBody @Validated InvoiceTitleForm form) {
+    	
+        boolean result = invoiceTitleService.updateForm(id,form);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除发票抬头表", security = {@SecurityRequirement(name = "Authorization")})
+    @DeleteMapping("/{ids}")
+    public Result<?> deleteUsers(
+            @Parameter(description = "发票抬头表ID,多个以英文逗号(,)分割") @PathVariable String ids
+    ) {
+    	if(StrUtil.isBlank(ids)) {
+    		 return Result.failed(ResultCode.PARAM_ERROR, "删除的发票抬头表数据为空");
+    	}
+        // 逻辑删除
+        List<Long> idList = Arrays.asList(ids.split(",")).stream()
+                .map(idStr -> Long.parseLong(idStr)).collect(Collectors.toList());
+        boolean result = invoiceTitleService.removeByIds(idList);
+        return Result.judge(result);
+    }
+    
+   
+
+
+}

+ 29 - 0
src/main/java/com/qmrb/system/converter/InvoiceTitleConverter.java

@@ -0,0 +1,29 @@
+package com.qmrb.system.converter;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.pojo.entity.InvoiceTitle;
+import com.qmrb.system.pojo.form.InvoiceTitleForm;
+import com.qmrb.system.pojo.vo.InvoiceTitleVO;
+
+/**
+ * 发票抬头表数据项对象转换器
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface InvoiceTitleConverter {
+
+    Page<InvoiceTitleVO> entity2Page(Page<InvoiceTitle> page);
+
+    InvoiceTitleForm entity2Form(InvoiceTitle entity);
+
+    @InheritInverseConfiguration(name="entity2Form")
+    InvoiceTitle form2Entity(InvoiceTitleForm form);
+    
+    InvoiceTitleVO entity2Vo(InvoiceTitle entity);
+}

+ 18 - 0
src/main/java/com/qmrb/system/mapper/InvoiceTitleMapper.java

@@ -0,0 +1,18 @@
+package com.qmrb.system.mapper;
+
+import com.qmrb.system.pojo.entity.InvoiceTitle;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 发票抬头表 Mapper 接口
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Mapper
+public interface InvoiceTitleMapper extends BaseMapper<InvoiceTitle> {
+
+}

+ 75 - 0
src/main/java/com/qmrb/system/pojo/entity/InvoiceTitle.java

@@ -0,0 +1,75 @@
+package com.qmrb.system.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.qmrb.system.common.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 发票抬头表
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("invoice_title")
+public class InvoiceTitle extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 抬头类型(1:企业单位,2:个人/非企业)
+     */
+    @TableField("title_type")
+    private Integer titleType;
+
+    /**
+     * 发票抬头名称
+     */
+    @TableField("title_name")
+    private String titleName;
+
+    /**
+     * 企业税号(企业单位必填)
+     */
+    @TableField("tax_no")
+    private String taxNo;
+
+    /**
+     * 手机号码
+     */
+    @TableField("mobile_phone")
+    private String mobilePhone;
+
+    /**
+     * 电子邮箱
+     */
+    @TableField("email")
+    private String email;
+
+    /**
+     * 是否默认抬头(0:否,1:是)
+     */
+    @TableField("is_default")
+    private Integer isDefault;
+
+    /**
+     * 状态(0:已使用,1:未使用,2:锁定)
+     */
+    @TableField("status")
+    private Integer status;
+
+
+}

+ 59 - 0
src/main/java/com/qmrb/system/pojo/form/InvoiceTitleForm.java

@@ -0,0 +1,59 @@
+package com.qmrb.system.pojo.form;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * <p>
+ * 发票抬头表表单
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Data
+public class InvoiceTitleForm {
+
+    /**
+     * 主键ID
+     */
+	@Schema(description = "主键ID",type="Long")
+    private Long id;
+    /**
+     * 抬头类型(1:企业单位,2:个人/非企业)
+     */
+	@Schema(description = "抬头类型(1:企业单位,2:个人/非企业)",type="Integer")
+    private Integer titleType;
+    /**
+     * 发票抬头名称
+     */
+	@Schema(description = "发票抬头名称",type="String")
+    private String titleName;
+    /**
+     * 企业税号(企业单位必填)
+     */
+	@Schema(description = "企业税号(企业单位必填)",type="String")
+    private String taxNo;
+    /**
+     * 手机号码
+     */
+	@Schema(description = "手机号码",type="String")
+    private String mobilePhone;
+    /**
+     * 电子邮箱
+     */
+	@Schema(description = "电子邮箱",type="String")
+    private String email;
+    /**
+     * 是否默认抬头(0:否,1:是)
+     */
+	@Schema(description = "是否默认抬头(0:否,1:是)",type="Integer")
+    private Integer isDefault;
+    /**
+     * 状态(0:已使用,1:未使用,2:锁定)
+     */
+	@Schema(description = "状态(0:已使用,1:未使用,2:锁定)",type="Integer")
+    private Integer status;
+
+
+}

+ 71 - 0
src/main/java/com/qmrb/system/pojo/query/InvoiceTitleQuery.java

@@ -0,0 +1,71 @@
+package com.qmrb.system.pojo.query;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.qmrb.system.common.base.BasePageQuery;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 发票抬头表查询对象
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class InvoiceTitleQuery extends BasePageQuery{
+
+ 	@Schema(description="关键字")
+    private String keywords;
+
+    /**
+     * 主键ID
+     */
+	@Schema(description = "主键ID",type="Long")
+    private Long id;
+    
+    /**
+     * 用户ID
+     */
+	@Schema(description = "用户ID",type="Long")
+    private Long userId;
+    /**
+     * 抬头类型(1:企业单位,2:个人/非企业)
+     */
+	@Schema(description = "抬头类型(1:企业单位,2:个人/非企业)",type="Integer")
+    private Integer titleType;
+    /**
+     * 发票抬头名称
+     */
+	@Schema(description = "发票抬头名称",type="String")
+    private String titleName;
+    /**
+     * 企业税号(企业单位必填)
+     */
+	@Schema(description = "企业税号(企业单位必填)",type="String")
+    private String taxNo;
+    /**
+     * 手机号码
+     */
+	@Schema(description = "手机号码",type="String")
+    private String mobilePhone;
+    /**
+     * 电子邮箱
+     */
+	@Schema(description = "电子邮箱",type="String")
+    private String email;
+    /**
+     * 是否默认抬头(0:否,1:是)
+     */
+	@Schema(description = "是否默认抬头(0:否,1:是)",type="Integer")
+    private Integer isDefault;
+    /**
+     * 状态(0:已使用,1:未使用,2:锁定)
+     */
+	@Schema(description = "状态(0:已使用,1:未使用,2:锁定)",type="Integer")
+    private Integer status;
+
+
+}

+ 63 - 0
src/main/java/com/qmrb/system/pojo/vo/InvoiceTitleVO.java

@@ -0,0 +1,63 @@
+package com.qmrb.system.pojo.vo;
+
+import java.util.List;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * <p>
+ * 发票抬头表视图对象
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Data
+public class InvoiceTitleVO {
+
+    /**
+     * 主键ID
+     */
+	@Schema(description = "主键ID",type="Long")
+    private Long id;
+    /**
+     * 抬头类型(1:企业单位,2:个人/非企业)
+     */
+	@Schema(description = "抬头类型(1:企业单位,2:个人/非企业)",type="Integer")
+    private Integer titleType;
+    /**
+     * 发票抬头名称
+     */
+	@Schema(description = "发票抬头名称",type="String")
+    private String titleName;
+    /**
+     * 企业税号(企业单位必填)
+     */
+	@Schema(description = "企业税号(企业单位必填)",type="String")
+    private String taxNo;
+    /**
+     * 手机号码
+     */
+	@Schema(description = "手机号码",type="String")
+    private String mobilePhone;
+    /**
+     * 电子邮箱
+     */
+	@Schema(description = "电子邮箱",type="String")
+    private String email;
+    /**
+     * 是否默认抬头(0:否,1:是)
+     */
+	@Schema(description = "是否默认抬头(0:否,1:是)",type="Integer")
+    private Integer isDefault;
+    /**
+     * 状态(0:已使用,1:未使用,2:锁定)
+     */
+	@Schema(description = "状态(0:已使用,1:未使用,2:锁定)",type="Integer")
+    private Integer status;
+
+	@Schema(description = "子分类")
+    private List<InvoiceTitleVO> children;
+
+
+}

+ 42 - 0
src/main/java/com/qmrb/system/service/IInvoiceTitleService.java

@@ -0,0 +1,42 @@
+package com.qmrb.system.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.pojo.entity.InvoiceTitle;
+import com.qmrb.system.pojo.form.InvoiceTitleForm;
+import com.qmrb.system.pojo.vo.InvoiceTitleVO;
+import com.qmrb.system.pojo.query.InvoiceTitleQuery;
+import com.qmrb.system.pojo.vo.Option;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.validation.Valid;
+
+/**
+ * <p>
+ * 发票抬头表 服务类
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+public interface IInvoiceTitleService extends IService<InvoiceTitle> {
+	
+	/**分页查询
+	 * */
+	public Page<InvoiceTitleVO> getPage(InvoiceTitleQuery queryParams);
+
+	/**
+	 * 保存表单
+	 * */
+	public InvoiceTitleForm saveForm(@Valid InvoiceTitleForm form);
+	
+	/**更新
+	 * */
+	public boolean updateForm(Long id, InvoiceTitleForm form);
+	
+	/**获取表单数据
+	 * */
+	public InvoiceTitleForm getFormData(Long id);
+	
+	
+}

+ 132 - 0
src/main/java/com/qmrb/system/service/impl/InvoiceTitleServiceImpl.java

@@ -0,0 +1,132 @@
+package com.qmrb.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.qmrb.system.framework.security.util.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qmrb.system.common.enums.StatusEnum;
+import com.qmrb.system.pojo.vo.Option;
+import com.qmrb.system.converter.InvoiceTitleConverter;
+import com.qmrb.system.pojo.entity.InvoiceTitle;
+import com.qmrb.system.pojo.form.InvoiceTitleForm;
+import com.qmrb.system.pojo.vo.InvoiceTitleVO;
+import com.qmrb.system.pojo.query.InvoiceTitleQuery;
+import com.qmrb.system.mapper.InvoiceTitleMapper;
+import com.qmrb.system.service.IInvoiceTitleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.lang.Assert;
+import jakarta.validation.Valid;
+
+/**
+ * <p>
+ * 发票抬头表 服务实现类
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-07
+ */
+@Service
+public class InvoiceTitleServiceImpl extends ServiceImpl<InvoiceTitleMapper, InvoiceTitle> implements IInvoiceTitleService {
+
+	@Autowired
+	private InvoiceTitleConverter converter;
+
+	/**分页查询
+	 * */
+	@Override
+	public Page<InvoiceTitleVO> getPage(InvoiceTitleQuery queryParams) {
+		// 查询参数
+        int pageNum = queryParams.getPageNum();
+        int pageSize = queryParams.getPageSize();
+        Integer status = queryParams.getStatus();
+        //String keywords = queryParams.getKeywords();
+
+        // 查询数据
+        Page<InvoiceTitle> dictItemPage = this.page(
+                new Page<>(pageNum, pageSize),
+                new LambdaQueryWrapper<InvoiceTitle>()
+                		.eq(status != null, InvoiceTitle::getStatus,status)
+						.eq(queryParams.getUserId() != null,InvoiceTitle::getCreateBy,queryParams.getUserId())
+                	//.like(StrUtil.isNotBlank(keywords), InvoiceTitle::getCategoryName, keywords)
+        );
+
+        // 实体转换
+        Page<InvoiceTitleVO> pageResult = converter.entity2Page(dictItemPage);
+        return pageResult;
+	}
+
+	/**
+	 * 保存表单
+	 * */
+	@Override
+	public InvoiceTitleForm saveForm(@Valid InvoiceTitleForm form) {
+		List<InvoiceTitle> list = this.list(new LambdaQueryWrapper<InvoiceTitle>().eq(InvoiceTitle::getCreateBy, SecurityUtils.getUserId()));
+		if(CollectionUtil.isEmpty(list)){
+			form.setIsDefault(1);
+		}else{
+			// 已设置默认,清除其他默认抬头
+			if(form.getIsDefault() != null && form.getIsDefault() == 1){
+				list = list.stream().map(item->{
+					item.setIsDefault(0);
+					return item;
+				}).collect(Collectors.toList());
+				this.updateBatchById(list);
+			}
+		}
+		form.setIsDefault(1);
+		// 实体对象转换 form->entity
+		InvoiceTitle entity = converter.form2Entity(form);
+        // 持久化
+        this.save(entity);
+        InvoiceTitleForm result = converter.entity2Form(entity);
+        return result;
+	}
+
+	/**更新
+	 * */
+	@Override
+	public boolean updateForm(Long id, InvoiceTitleForm form) {
+		List<InvoiceTitle> list = this.list(new LambdaQueryWrapper<InvoiceTitle>().eq(InvoiceTitle::getCreateBy, SecurityUtils.getUserId()));
+		if(CollectionUtil.isEmpty(list)){
+			form.setIsDefault(1);
+		}else{
+			// 已设置默认,清除其他默认抬头
+			if(form.getIsDefault() != null && form.getIsDefault() == 1){
+				list = list.stream().map(item->{
+					item.setIsDefault(0);
+					return item;
+				}).collect(Collectors.toList());
+				this.updateBatchById(list);
+			}
+		}
+		InvoiceTitle entity = converter.form2Entity(form);
+		entity.setId(id);
+        boolean result = this.updateById(entity);
+        return result;
+	}
+
+	/**获取表单数据
+	 * */
+	@Override
+	public InvoiceTitleForm getFormData(Long id) {
+		// 获取entity
+		InvoiceTitle entity = this.getById(id);
+        Assert.isTrue(entity != null, "发票抬头表不存在");
+
+        // 实体转换
+        InvoiceTitleForm form = converter.entity2Form(entity);
+        return form;
+	}
+	
+	
+}

+ 5 - 0
src/main/resources/mapper/InvoiceTitleMapper.xml

@@ -0,0 +1,5 @@
+<?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.qmrb.system.mapper.InvoiceTitleMapper">
+
+</mapper>