# Conflicts:
#	yunxi-ui-admin-vue3/src/views/xxjj/businessWarehouse/increased.vue
pull/1/head
Vayne 1 year ago
commit 80e367f5ee

@ -103,10 +103,17 @@ public interface ErrorCodeConstants {
// ========== 合同信息 500100001 ========== // ========== 合同信息 500100001 ==========
ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1005000001, "合同信息不存在"); ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1005000001, "合同信息不存在");
// ========== 合同详情信息 500100001 ========== // ========== 合同详情信息 500100001 ==========
ErrorCode CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1005000002, "合同详情信息不存在"); ErrorCode CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1005000002, "合同详情信息不存在");
// ========== 合同条款 TODO 补充编号 ==========
ErrorCode CONTRACT_CLAUSE_NOT_EXISTS = new ErrorCode(1005000012, "合同条款不存在");
// ========== 合同模板 TODO 补充编号 ==========
ErrorCode CONTRACT_TEMPLATE_NOT_EXISTS = new ErrorCode(1005000013, "合同模板不存在");
// ========== 主体负责人转移 TODO 补充编号 ========== // ========== 主体负责人转移 TODO 补充编号 ==========
ErrorCode SUBJECT_TRANSFER_NOT_EXISTS = new ErrorCode(1005000003, "主体负责人转移不存在"); ErrorCode SUBJECT_TRANSFER_NOT_EXISTS = new ErrorCode(1005000003, "主体负责人转移不存在");

@ -0,0 +1,102 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.common.pojo.CommonResult;
import static com.yunxi.scm.framework.common.pojo.CommonResult.success;
import com.yunxi.scm.framework.excel.core.util.ExcelUtils;
import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contractclause.ContractClauseDO;
import com.yunxi.scm.module.xxjj.convert.contractclause.ContractClauseConvert;
import com.yunxi.scm.module.xxjj.service.contractclause.ContractClauseService;
@Tag(name = "管理后台 - 合同条款")
@RestController
@RequestMapping("/xxjj/contract-clause")
@Validated
public class ContractClauseController {
@Resource
private ContractClauseService contractClauseService;
@PostMapping("/create")
@Operation(summary = "创建合同条款")
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:create')")
public CommonResult<Long> createContractClause(@Valid @RequestBody ContractClauseCreateReqVO createReqVO) {
return success(contractClauseService.createContractClause(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新合同条款")
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:update')")
public CommonResult<Boolean> updateContractClause(@Valid @RequestBody ContractClauseUpdateReqVO updateReqVO) {
contractClauseService.updateContractClause(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除合同条款")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:delete')")
public CommonResult<Boolean> deleteContractClause(@RequestParam("id") Long id) {
contractClauseService.deleteContractClause(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得合同条款")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:query')")
public CommonResult<ContractClauseRespVO> getContractClause(@RequestParam("id") Long id) {
ContractClauseDO contractClause = contractClauseService.getContractClause(id);
return success(ContractClauseConvert.INSTANCE.convert(contractClause));
}
@GetMapping("/list")
@Operation(summary = "获得合同条款列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:query')")
public CommonResult<List<ContractClauseRespVO>> getContractClauseList(@RequestParam("ids") Collection<Long> ids) {
List<ContractClauseDO> list = contractClauseService.getContractClauseList(ids);
return success(ContractClauseConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得合同条款分页")
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:query')")
public CommonResult<PageResult<ContractClauseRespVO>> getContractClausePage(@Valid ContractClausePageReqVO pageVO) {
PageResult<ContractClauseDO> pageResult = contractClauseService.getContractClausePage(pageVO);
return success(ContractClauseConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@Operation(summary = "导出合同条款 Excel")
@PreAuthorize("@ss.hasPermission('xxjj:contract-clause:export')")
@OperateLog(type = EXPORT)
public void exportContractClauseExcel(@Valid ContractClauseExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<ContractClauseDO> list = contractClauseService.getContractClauseList(exportReqVO);
// 导出 Excel
List<ContractClauseExcelVO> datas = ContractClauseConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "合同条款.xls", "数据", ContractClauseExcelVO.class, datas);
}
}

@ -0,0 +1,42 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import javax.validation.constraints.*;
/**
* Base VO VO 使
* VO Swagger
*/
@Data
public class ContractClauseBaseVO {
@Schema(description = "条款标题", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "条款标题不能为空")
private String title;
@Schema(description = "条款类型 参考字典contract_clause_type", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "条款类型 参考字典contract_clause_type不能为空")
private String type;
@Schema(description = "状态 参考字典contract_clause_status", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "状态 参考字典contract_clause_status不能为空")
private String status;
@Schema(description = "条款内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "条款内容不能为空")
private String content;
@Schema(description = "权重值")
private Short weight;
@Schema(description = "备注", example = "随便")
private String remark;
@Schema(description = "附件")
private String attachment;
}

@ -0,0 +1,14 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 合同条款创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractClauseCreateReqVO extends ContractClauseBaseVO {
}

@ -0,0 +1,51 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yunxi.scm.framework.excel.core.annotations.DictFormat;
import com.yunxi.scm.framework.excel.core.convert.DictConvert;
/**
* Excel VO
*
* @author
*/
@Data
public class ContractClauseExcelVO {
@ExcelProperty("编号")
private Long id;
@ExcelProperty("条款标题")
private String title;
@ExcelProperty(value = "条款类型 参考字典contract_clause_type", converter = DictConvert.class)
@DictFormat("contract_clause_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String type;
@ExcelProperty(value = "状态 参考字典contract_clause_status", converter = DictConvert.class)
@DictFormat("contract_clause_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String status;
@ExcelProperty("条款内容")
private String content;
@ExcelProperty("权重值")
private Short weight;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("附件")
private String attachment;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,29 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 合同条款 Excel 导出 Request VO参数和 ContractClausePageReqVO 是一致的")
@Data
public class ContractClauseExportReqVO {
@Schema(description = "条款标题")
private String title;
@Schema(description = "条款类型 参考字典contract_clause_type", example = "1")
private String type;
@Schema(description = "状态 参考字典contract_clause_status", example = "2")
private String status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,31 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 合同条款分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractClausePageReqVO extends PageParam {
@Schema(description = "条款标题")
private String title;
@Schema(description = "条款类型 参考字典contract_clause_type", example = "1")
private String type;
@Schema(description = "状态 参考字典contract_clause_status", example = "2")
private String status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,19 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 合同条款 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractClauseRespVO extends ContractClauseBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7146")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

@ -0,0 +1,18 @@
package com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 合同条款更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractClauseUpdateReqVO extends ContractClauseBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7146")
@NotNull(message = "编号不能为空")
private Long id;
}

@ -0,0 +1,102 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.common.pojo.CommonResult;
import static com.yunxi.scm.framework.common.pojo.CommonResult.success;
import com.yunxi.scm.framework.excel.core.util.ExcelUtils;
import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate.ContractTemplateDO;
import com.yunxi.scm.module.xxjj.convert.contracttemplate.ContractTemplateConvert;
import com.yunxi.scm.module.xxjj.service.contracttemplate.ContractTemplateService;
@Tag(name = "管理后台 - 合同模板")
@RestController
@RequestMapping("/xxjj/contract-template")
@Validated
public class ContractTemplateController {
@Resource
private ContractTemplateService contractTemplateService;
@PostMapping("/create")
@Operation(summary = "创建合同模板")
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:create')")
public CommonResult<Long> createContractTemplate(@Valid @RequestBody ContractTemplateCreateReqVO createReqVO) {
return success(contractTemplateService.createContractTemplate(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新合同模板")
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:update')")
public CommonResult<Boolean> updateContractTemplate(@Valid @RequestBody ContractTemplateUpdateReqVO updateReqVO) {
contractTemplateService.updateContractTemplate(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除合同模板")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:delete')")
public CommonResult<Boolean> deleteContractTemplate(@RequestParam("id") Long id) {
contractTemplateService.deleteContractTemplate(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得合同模板")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:query')")
public CommonResult<ContractTemplateRespVO> getContractTemplate(@RequestParam("id") Long id) {
ContractTemplateDO contractTemplate = contractTemplateService.getContractTemplate(id);
return success(ContractTemplateConvert.INSTANCE.convert(contractTemplate));
}
@GetMapping("/list")
@Operation(summary = "获得合同模板列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:query')")
public CommonResult<List<ContractTemplateRespVO>> getContractTemplateList(@RequestParam("ids") Collection<Long> ids) {
List<ContractTemplateDO> list = contractTemplateService.getContractTemplateList(ids);
return success(ContractTemplateConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得合同模板分页")
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:query')")
public CommonResult<PageResult<ContractTemplateRespVO>> getContractTemplatePage(@Valid ContractTemplatePageReqVO pageVO) {
PageResult<ContractTemplateDO> pageResult = contractTemplateService.getContractTemplatePage(pageVO);
return success(ContractTemplateConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@Operation(summary = "导出合同模板 Excel")
@PreAuthorize("@ss.hasPermission('xxjj:contract-template:export')")
@OperateLog(type = EXPORT)
public void exportContractTemplateExcel(@Valid ContractTemplateExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<ContractTemplateDO> list = contractTemplateService.getContractTemplateList(exportReqVO);
// 导出 Excel
List<ContractTemplateExcelVO> datas = ContractTemplateConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "合同模板.xls", "数据", ContractTemplateExcelVO.class, datas);
}
}

@ -0,0 +1,37 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import javax.validation.constraints.*;
/**
* Base VO VO 使
* VO Swagger
*/
@Data
public class ContractTemplateBaseVO {
@Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@NotNull(message = "模板名称不能为空")
private String name;
@Schema(description = "合同模板类型 参考字典contract_template_type", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "合同模板类型 参考字典contract_template_type不能为空")
private String type;
@Schema(description = "状态 参考字典contract_template_status", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态 参考字典contract_template_status不能为空")
private String status;
@Schema(description = "模板描述", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "模板描述不能为空")
private String describe;
@Schema(description = "配置项 json格式", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "配置项 json格式不能为空")
private String options;
}

@ -0,0 +1,14 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 合同模板创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractTemplateCreateReqVO extends ContractTemplateBaseVO {
}

@ -0,0 +1,45 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yunxi.scm.framework.excel.core.annotations.DictFormat;
import com.yunxi.scm.framework.excel.core.convert.DictConvert;
/**
* Excel VO
*
* @author
*/
@Data
public class ContractTemplateExcelVO {
@ExcelProperty("编号")
private Long id;
@ExcelProperty("模板名称")
private String name;
@ExcelProperty(value = "合同模板类型 参考字典contract_template_type", converter = DictConvert.class)
@DictFormat("contract_template_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String type;
@ExcelProperty(value = "状态 参考字典contract_template_status", converter = DictConvert.class)
@DictFormat("contract_template_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private String status;
@ExcelProperty("模板描述")
private String describe;
@ExcelProperty("配置项 json格式")
private String options;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,29 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 合同模板 Excel 导出 Request VO参数和 ContractTemplatePageReqVO 是一致的")
@Data
public class ContractTemplateExportReqVO {
@Schema(description = "模板名称", example = "李四")
private String name;
@Schema(description = "合同模板类型 参考字典contract_template_type", example = "1")
private String type;
@Schema(description = "状态 参考字典contract_template_status", example = "1")
private String status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,31 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 合同模板分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractTemplatePageReqVO extends PageParam {
@Schema(description = "模板名称", example = "李四")
private String name;
@Schema(description = "合同模板类型 参考字典contract_template_type", example = "1")
private String type;
@Schema(description = "状态 参考字典contract_template_status", example = "1")
private String status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,19 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 合同模板 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractTemplateRespVO extends ContractTemplateBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21453")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

@ -0,0 +1,18 @@
package com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 合同模板更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractTemplateUpdateReqVO extends ContractTemplateBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21453")
@NotNull(message = "编号不能为空")
private Long id;
}

@ -0,0 +1,34 @@
package com.yunxi.scm.module.xxjj.convert.contractclause;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contractclause.ContractClauseDO;
/**
* Convert
*
* @author
*/
@Mapper
public interface ContractClauseConvert {
ContractClauseConvert INSTANCE = Mappers.getMapper(ContractClauseConvert.class);
ContractClauseDO convert(ContractClauseCreateReqVO bean);
ContractClauseDO convert(ContractClauseUpdateReqVO bean);
ContractClauseRespVO convert(ContractClauseDO bean);
List<ContractClauseRespVO> convertList(List<ContractClauseDO> list);
PageResult<ContractClauseRespVO> convertPage(PageResult<ContractClauseDO> page);
List<ContractClauseExcelVO> convertList02(List<ContractClauseDO> list);
}

@ -0,0 +1,34 @@
package com.yunxi.scm.module.xxjj.convert.contracttemplate;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate.ContractTemplateDO;
/**
* Convert
*
* @author
*/
@Mapper
public interface ContractTemplateConvert {
ContractTemplateConvert INSTANCE = Mappers.getMapper(ContractTemplateConvert.class);
ContractTemplateDO convert(ContractTemplateCreateReqVO bean);
ContractTemplateDO convert(ContractTemplateUpdateReqVO bean);
ContractTemplateRespVO convert(ContractTemplateDO bean);
List<ContractTemplateRespVO> convertList(List<ContractTemplateDO> list);
PageResult<ContractTemplateRespVO> convertPage(PageResult<ContractTemplateDO> page);
List<ContractTemplateExcelVO> convertList02(List<ContractTemplateDO> list);
}

@ -0,0 +1,63 @@
package com.yunxi.scm.module.xxjj.dal.dataobject.contractclause;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("xxjj_contract_clause")
@KeySequence("xxjj_contract_clause_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ContractClauseDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private String title;
/**
* contract_clause_type
*
* {@link TODO contract_clause_type }
*/
private String type;
/**
* contract_clause_status
*
* {@link TODO contract_clause_status }
*/
private String status;
/**
*
*/
private String content;
/**
*
*/
private Short weight;
/**
*
*/
private String remark;
/**
*
*/
private String attachment;
}

@ -0,0 +1,55 @@
package com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("xxjj_contract_template")
@KeySequence("xxjj_contract_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ContractTemplateDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private String name;
/**
* contract_template_type
*
* {@link TODO contract_template_type }
*/
private String type;
/**
* contract_template_status
*
* {@link TODO contract_template_status }
*/
private String status;
/**
*
*/
private String describe;
/**
* json
*/
private String options;
}

@ -0,0 +1,38 @@
package com.yunxi.scm.module.xxjj.dal.mysql.contractclause;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.module.xxjj.dal.dataobject.contractclause.ContractClauseDO;
import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface ContractClauseMapper extends BaseMapperX<ContractClauseDO> {
default PageResult<ContractClauseDO> selectPage(ContractClausePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ContractClauseDO>()
.eqIfPresent(ContractClauseDO::getTitle, reqVO.getTitle())
.eqIfPresent(ContractClauseDO::getType, reqVO.getType())
.eqIfPresent(ContractClauseDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ContractClauseDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ContractClauseDO::getId));
}
default List<ContractClauseDO> selectList(ContractClauseExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<ContractClauseDO>()
.eqIfPresent(ContractClauseDO::getTitle, reqVO.getTitle())
.eqIfPresent(ContractClauseDO::getType, reqVO.getType())
.eqIfPresent(ContractClauseDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ContractClauseDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ContractClauseDO::getId));
}
}

@ -0,0 +1,38 @@
package com.yunxi.scm.module.xxjj.dal.mysql.contracttemplate;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate.ContractTemplateDO;
import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface ContractTemplateMapper extends BaseMapperX<ContractTemplateDO> {
default PageResult<ContractTemplateDO> selectPage(ContractTemplatePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ContractTemplateDO>()
.likeIfPresent(ContractTemplateDO::getName, reqVO.getName())
.eqIfPresent(ContractTemplateDO::getType, reqVO.getType())
.eqIfPresent(ContractTemplateDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ContractTemplateDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ContractTemplateDO::getId));
}
default List<ContractTemplateDO> selectList(ContractTemplateExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<ContractTemplateDO>()
.likeIfPresent(ContractTemplateDO::getName, reqVO.getName())
.eqIfPresent(ContractTemplateDO::getType, reqVO.getType())
.eqIfPresent(ContractTemplateDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ContractTemplateDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ContractTemplateDO::getId));
}
}

@ -0,0 +1,70 @@
package com.yunxi.scm.module.xxjj.service.contractclause;
import java.util.*;
import javax.validation.*;
import com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contractclause.ContractClauseDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
/**
* Service
*
* @author
*/
public interface ContractClauseService {
/**
*
*
* @param createReqVO
* @return
*/
Long createContractClause(@Valid ContractClauseCreateReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateContractClause(@Valid ContractClauseUpdateReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteContractClause(Long id);
/**
*
*
* @param id
* @return
*/
ContractClauseDO getContractClause(Long id);
/**
*
*
* @param ids
* @return
*/
List<ContractClauseDO> getContractClauseList(Collection<Long> ids);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<ContractClauseDO> getContractClausePage(ContractClausePageReqVO pageReqVO);
/**
* , Excel
*
* @param exportReqVO
* @return
*/
List<ContractClauseDO> getContractClauseList(ContractClauseExportReqVO exportReqVO);
}

@ -0,0 +1,82 @@
package com.yunxi.scm.module.xxjj.service.contractclause;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contractclause.ContractClauseDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.module.xxjj.convert.contractclause.ContractClauseConvert;
import com.yunxi.scm.module.xxjj.dal.mysql.contractclause.ContractClauseMapper;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class ContractClauseServiceImpl implements ContractClauseService {
@Resource
private ContractClauseMapper contractClauseMapper;
@Override
public Long createContractClause(ContractClauseCreateReqVO createReqVO) {
// 插入
ContractClauseDO contractClause = ContractClauseConvert.INSTANCE.convert(createReqVO);
contractClauseMapper.insert(contractClause);
// 返回
return contractClause.getId();
}
@Override
public void updateContractClause(ContractClauseUpdateReqVO updateReqVO) {
// 校验存在
validateContractClauseExists(updateReqVO.getId());
// 更新
ContractClauseDO updateObj = ContractClauseConvert.INSTANCE.convert(updateReqVO);
contractClauseMapper.updateById(updateObj);
}
@Override
public void deleteContractClause(Long id) {
// 校验存在
validateContractClauseExists(id);
// 删除
contractClauseMapper.deleteById(id);
}
private void validateContractClauseExists(Long id) {
if (contractClauseMapper.selectById(id) == null) {
throw exception(CONTRACT_CLAUSE_NOT_EXISTS);
}
}
@Override
public ContractClauseDO getContractClause(Long id) {
return contractClauseMapper.selectById(id);
}
@Override
public List<ContractClauseDO> getContractClauseList(Collection<Long> ids) {
return contractClauseMapper.selectBatchIds(ids);
}
@Override
public PageResult<ContractClauseDO> getContractClausePage(ContractClausePageReqVO pageReqVO) {
return contractClauseMapper.selectPage(pageReqVO);
}
@Override
public List<ContractClauseDO> getContractClauseList(ContractClauseExportReqVO exportReqVO) {
return contractClauseMapper.selectList(exportReqVO);
}
}

@ -0,0 +1,70 @@
package com.yunxi.scm.module.xxjj.service.contracttemplate;
import java.util.*;
import javax.validation.*;
import com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate.ContractTemplateDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
/**
* Service
*
* @author
*/
public interface ContractTemplateService {
/**
*
*
* @param createReqVO
* @return
*/
Long createContractTemplate(@Valid ContractTemplateCreateReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateContractTemplate(@Valid ContractTemplateUpdateReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteContractTemplate(Long id);
/**
*
*
* @param id
* @return
*/
ContractTemplateDO getContractTemplate(Long id);
/**
*
*
* @param ids
* @return
*/
List<ContractTemplateDO> getContractTemplateList(Collection<Long> ids);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<ContractTemplateDO> getContractTemplatePage(ContractTemplatePageReqVO pageReqVO);
/**
* , Excel
*
* @param exportReqVO
* @return
*/
List<ContractTemplateDO> getContractTemplateList(ContractTemplateExportReqVO exportReqVO);
}

@ -0,0 +1,82 @@
package com.yunxi.scm.module.xxjj.service.contracttemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate.ContractTemplateDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.module.xxjj.convert.contracttemplate.ContractTemplateConvert;
import com.yunxi.scm.module.xxjj.dal.mysql.contracttemplate.ContractTemplateMapper;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class ContractTemplateServiceImpl implements ContractTemplateService {
@Resource
private ContractTemplateMapper contractTemplateMapper;
@Override
public Long createContractTemplate(ContractTemplateCreateReqVO createReqVO) {
// 插入
ContractTemplateDO contractTemplate = ContractTemplateConvert.INSTANCE.convert(createReqVO);
contractTemplateMapper.insert(contractTemplate);
// 返回
return contractTemplate.getId();
}
@Override
public void updateContractTemplate(ContractTemplateUpdateReqVO updateReqVO) {
// 校验存在
validateContractTemplateExists(updateReqVO.getId());
// 更新
ContractTemplateDO updateObj = ContractTemplateConvert.INSTANCE.convert(updateReqVO);
contractTemplateMapper.updateById(updateObj);
}
@Override
public void deleteContractTemplate(Long id) {
// 校验存在
validateContractTemplateExists(id);
// 删除
contractTemplateMapper.deleteById(id);
}
private void validateContractTemplateExists(Long id) {
if (contractTemplateMapper.selectById(id) == null) {
throw exception(CONTRACT_TEMPLATE_NOT_EXISTS);
}
}
@Override
public ContractTemplateDO getContractTemplate(Long id) {
return contractTemplateMapper.selectById(id);
}
@Override
public List<ContractTemplateDO> getContractTemplateList(Collection<Long> ids) {
return contractTemplateMapper.selectBatchIds(ids);
}
@Override
public PageResult<ContractTemplateDO> getContractTemplatePage(ContractTemplatePageReqVO pageReqVO) {
return contractTemplateMapper.selectPage(pageReqVO);
}
@Override
public List<ContractTemplateDO> getContractTemplateList(ContractTemplateExportReqVO exportReqVO) {
return contractTemplateMapper.selectList(exportReqVO);
}
}

@ -0,0 +1,12 @@
<?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.yunxi.scm.module.xxjj.dal.mysql.contractclause.ContractClauseMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,12 @@
<?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.yunxi.scm.module.xxjj.dal.mysql.contracttemplate.ContractTemplateMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,175 @@
package com.yunxi.scm.module.xxjj.service.contractclause;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest;
import com.yunxi.scm.module.xxjj.controller.admin.contractclause.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contractclause.ContractClauseDO;
import com.yunxi.scm.module.xxjj.dal.mysql.contractclause.ContractClauseMapper;
import com.yunxi.scm.framework.common.pojo.PageResult;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
import static cn.hutool.core.util.RandomUtil.*;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
import static com.yunxi.scm.framework.test.core.util.AssertUtils.*;
import static com.yunxi.scm.framework.test.core.util.RandomUtils.*;
import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*;
import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*;
import static com.yunxi.scm.framework.common.util.date.DateUtils.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* {@link ContractClauseServiceImpl}
*
* @author
*/
@Import(ContractClauseServiceImpl.class)
public class ContractClauseServiceImplTest extends BaseDbUnitTest {
@Resource
private ContractClauseServiceImpl contractClauseService;
@Resource
private ContractClauseMapper contractClauseMapper;
@Test
public void testCreateContractClause_success() {
// 准备参数
ContractClauseCreateReqVO reqVO = randomPojo(ContractClauseCreateReqVO.class);
// 调用
Long contractClauseId = contractClauseService.createContractClause(reqVO);
// 断言
assertNotNull(contractClauseId);
// 校验记录的属性是否正确
ContractClauseDO contractClause = contractClauseMapper.selectById(contractClauseId);
assertPojoEquals(reqVO, contractClause);
}
@Test
public void testUpdateContractClause_success() {
// mock 数据
ContractClauseDO dbContractClause = randomPojo(ContractClauseDO.class);
contractClauseMapper.insert(dbContractClause);// @Sql: 先插入出一条存在的数据
// 准备参数
ContractClauseUpdateReqVO reqVO = randomPojo(ContractClauseUpdateReqVO.class, o -> {
o.setId(dbContractClause.getId()); // 设置更新的 ID
});
// 调用
contractClauseService.updateContractClause(reqVO);
// 校验是否更新正确
ContractClauseDO contractClause = contractClauseMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, contractClause);
}
@Test
public void testUpdateContractClause_notExists() {
// 准备参数
ContractClauseUpdateReqVO reqVO = randomPojo(ContractClauseUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> contractClauseService.updateContractClause(reqVO), CONTRACT_CLAUSE_NOT_EXISTS);
}
@Test
public void testDeleteContractClause_success() {
// mock 数据
ContractClauseDO dbContractClause = randomPojo(ContractClauseDO.class);
contractClauseMapper.insert(dbContractClause);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbContractClause.getId();
// 调用
contractClauseService.deleteContractClause(id);
// 校验数据不存在了
assertNull(contractClauseMapper.selectById(id));
}
@Test
public void testDeleteContractClause_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> contractClauseService.deleteContractClause(id), CONTRACT_CLAUSE_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetContractClausePage() {
// mock 数据
ContractClauseDO dbContractClause = randomPojo(ContractClauseDO.class, o -> { // 等会查询到
o.setTitle(null);
o.setType(null);
o.setStatus(null);
o.setCreateTime(null);
});
contractClauseMapper.insert(dbContractClause);
// 测试 title 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setTitle(null)));
// 测试 type 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setType(null)));
// 测试 status 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setStatus(null)));
// 测试 createTime 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setCreateTime(null)));
// 准备参数
ContractClausePageReqVO reqVO = new ContractClausePageReqVO();
reqVO.setTitle(null);
reqVO.setType(null);
reqVO.setStatus(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
PageResult<ContractClauseDO> pageResult = contractClauseService.getContractClausePage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbContractClause, pageResult.getList().get(0));
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetContractClauseList() {
// mock 数据
ContractClauseDO dbContractClause = randomPojo(ContractClauseDO.class, o -> { // 等会查询到
o.setTitle(null);
o.setType(null);
o.setStatus(null);
o.setCreateTime(null);
});
contractClauseMapper.insert(dbContractClause);
// 测试 title 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setTitle(null)));
// 测试 type 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setType(null)));
// 测试 status 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setStatus(null)));
// 测试 createTime 不匹配
contractClauseMapper.insert(cloneIgnoreId(dbContractClause, o -> o.setCreateTime(null)));
// 准备参数
ContractClauseExportReqVO reqVO = new ContractClauseExportReqVO();
reqVO.setTitle(null);
reqVO.setType(null);
reqVO.setStatus(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
List<ContractClauseDO> list = contractClauseService.getContractClauseList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbContractClause, list.get(0));
}
}

@ -0,0 +1,175 @@
package com.yunxi.scm.module.xxjj.service.contracttemplate;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest;
import com.yunxi.scm.module.xxjj.controller.admin.contracttemplate.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.contracttemplate.ContractTemplateDO;
import com.yunxi.scm.module.xxjj.dal.mysql.contracttemplate.ContractTemplateMapper;
import com.yunxi.scm.framework.common.pojo.PageResult;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
import static cn.hutool.core.util.RandomUtil.*;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
import static com.yunxi.scm.framework.test.core.util.AssertUtils.*;
import static com.yunxi.scm.framework.test.core.util.RandomUtils.*;
import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*;
import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*;
import static com.yunxi.scm.framework.common.util.date.DateUtils.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* {@link ContractTemplateServiceImpl}
*
* @author
*/
@Import(ContractTemplateServiceImpl.class)
public class ContractTemplateServiceImplTest extends BaseDbUnitTest {
@Resource
private ContractTemplateServiceImpl contractTemplateService;
@Resource
private ContractTemplateMapper contractTemplateMapper;
@Test
public void testCreateContractTemplate_success() {
// 准备参数
ContractTemplateCreateReqVO reqVO = randomPojo(ContractTemplateCreateReqVO.class);
// 调用
Long contractTemplateId = contractTemplateService.createContractTemplate(reqVO);
// 断言
assertNotNull(contractTemplateId);
// 校验记录的属性是否正确
ContractTemplateDO contractTemplate = contractTemplateMapper.selectById(contractTemplateId);
assertPojoEquals(reqVO, contractTemplate);
}
@Test
public void testUpdateContractTemplate_success() {
// mock 数据
ContractTemplateDO dbContractTemplate = randomPojo(ContractTemplateDO.class);
contractTemplateMapper.insert(dbContractTemplate);// @Sql: 先插入出一条存在的数据
// 准备参数
ContractTemplateUpdateReqVO reqVO = randomPojo(ContractTemplateUpdateReqVO.class, o -> {
o.setId(dbContractTemplate.getId()); // 设置更新的 ID
});
// 调用
contractTemplateService.updateContractTemplate(reqVO);
// 校验是否更新正确
ContractTemplateDO contractTemplate = contractTemplateMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, contractTemplate);
}
@Test
public void testUpdateContractTemplate_notExists() {
// 准备参数
ContractTemplateUpdateReqVO reqVO = randomPojo(ContractTemplateUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> contractTemplateService.updateContractTemplate(reqVO), CONTRACT_TEMPLATE_NOT_EXISTS);
}
@Test
public void testDeleteContractTemplate_success() {
// mock 数据
ContractTemplateDO dbContractTemplate = randomPojo(ContractTemplateDO.class);
contractTemplateMapper.insert(dbContractTemplate);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbContractTemplate.getId();
// 调用
contractTemplateService.deleteContractTemplate(id);
// 校验数据不存在了
assertNull(contractTemplateMapper.selectById(id));
}
@Test
public void testDeleteContractTemplate_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> contractTemplateService.deleteContractTemplate(id), CONTRACT_TEMPLATE_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetContractTemplatePage() {
// mock 数据
ContractTemplateDO dbContractTemplate = randomPojo(ContractTemplateDO.class, o -> { // 等会查询到
o.setName(null);
o.setType(null);
o.setStatus(null);
o.setCreateTime(null);
});
contractTemplateMapper.insert(dbContractTemplate);
// 测试 name 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setName(null)));
// 测试 type 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setType(null)));
// 测试 status 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setStatus(null)));
// 测试 createTime 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setCreateTime(null)));
// 准备参数
ContractTemplatePageReqVO reqVO = new ContractTemplatePageReqVO();
reqVO.setName(null);
reqVO.setType(null);
reqVO.setStatus(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
PageResult<ContractTemplateDO> pageResult = contractTemplateService.getContractTemplatePage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbContractTemplate, pageResult.getList().get(0));
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetContractTemplateList() {
// mock 数据
ContractTemplateDO dbContractTemplate = randomPojo(ContractTemplateDO.class, o -> { // 等会查询到
o.setName(null);
o.setType(null);
o.setStatus(null);
o.setCreateTime(null);
});
contractTemplateMapper.insert(dbContractTemplate);
// 测试 name 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setName(null)));
// 测试 type 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setType(null)));
// 测试 status 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setStatus(null)));
// 测试 createTime 不匹配
contractTemplateMapper.insert(cloneIgnoreId(dbContractTemplate, o -> o.setCreateTime(null)));
// 准备参数
ContractTemplateExportReqVO reqVO = new ContractTemplateExportReqVO();
reqVO.setName(null);
reqVO.setType(null);
reqVO.setStatus(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
List<ContractTemplateDO> list = contractTemplateService.getContractTemplateList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbContractTemplate, list.get(0));
}
}

@ -1,3 +1,5 @@
-- SQL yunxi-module-xxjj-biz test/resources/sql/clean.sql -- SQL yunxi-module-xxjj-biz test/resources/sql/clean.sql
DELETE FROM "xxjj_contract"; DELETE FROM "xxjj_contract";
DELETE FROM "xxjj_contract_info"; DELETE FROM "xxjj_contract_info";
DELETE FROM "xxjj_contract_clause";
DELETE FROM "xxjj_contract_template";

@ -56,4 +56,38 @@ CREATE TABLE IF NOT EXISTS "xxjj_contract_info" (
"deleted" bit NOT NULL DEFAULT FALSE, "deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL, "tenant_id" bigint NOT NULL,
PRIMARY KEY ("id") PRIMARY KEY ("id")
) COMMENT ''; ) COMMENT '';
CREATE TABLE IF NOT EXISTS "xxjj_contract_template" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar NOT NULL,
"type" varchar NOT NULL,
"status" varchar NOT NULL,
"describe" varchar NOT NULL,
"options" varchar NOT NULL,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL,
PRIMARY KEY ("id")
) COMMENT '';
CREATE TABLE IF NOT EXISTS "xxjj_contract_clause" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"title" varchar NOT NULL,
"type" varchar NOT NULL,
"status" varchar NOT NULL,
"content" varchar NOT NULL,
"weight" varchar,
"remark" varchar,
"attachment" varchar,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL,
PRIMARY KEY ("id")
) COMMENT '';

@ -0,0 +1,42 @@
import request from '@/config/axios'
export interface ContractClauseVO {
id: number
title: string
type: string
status: string
content: string
weight: number
remark: string
attachment: string
}
// 查询合同条款列表
export const getContractClausePage = async (params) => {
return await request.get({ url: `/xxjj/contract-clause/page`, params })
}
// 查询合同条款详情
export const getContractClause = async (id: number) => {
return await request.get({ url: `/xxjj/contract-clause/get?id=` + id })
}
// 新增合同条款
export const createContractClause = async (data: ContractClauseVO) => {
return await request.post({ url: `/xxjj/contract-clause/create`, data })
}
// 修改合同条款
export const updateContractClause = async (data: ContractClauseVO) => {
return await request.put({ url: `/xxjj/contract-clause/update`, data })
}
// 删除合同条款
export const deleteContractClause = async (id: number) => {
return await request.delete({ url: `/xxjj/contract-clause/delete?id=` + id })
}
// 导出合同条款 Excel
export const exportContractClause = async (params) => {
return await request.download({ url: `/xxjj/contract-clause/export-excel`, params })
}

@ -0,0 +1,40 @@
import request from '@/config/axios'
export interface ContractTemplateVO {
id: number
name: string
type: string
status: string
describe: string
options: string
}
// 查询合同模板列表
export const getContractTemplatePage = async (params) => {
return await request.get({ url: `/xxjj/contract-template/page`, params })
}
// 查询合同模板详情
export const getContractTemplate = async (id: number) => {
return await request.get({ url: `/xxjj/contract-template/get?id=` + id })
}
// 新增合同模板
export const createContractTemplate = async (data: ContractTemplateVO) => {
return await request.post({ url: `/xxjj/contract-template/create`, data })
}
// 修改合同模板
export const updateContractTemplate = async (data: ContractTemplateVO) => {
return await request.put({ url: `/xxjj/contract-template/update`, data })
}
// 删除合同模板
export const deleteContractTemplate = async (id: number) => {
return await request.delete({ url: `/xxjj/contract-template/delete?id=` + id })
}
// 导出合同模板 Excel
export const exportContractTemplate = async (params) => {
return await request.download({ url: `/xxjj/contract-template/export-excel`, params })
}

@ -20,7 +20,7 @@
:on-preview="handlePreview" :on-preview="handlePreview"
class="upload-file-uploader" class="upload-file-uploader"
> >
<el-button type="primary"><Icon icon="ep:upload-filled" />选取文件</el-button> <el-button type="primary"><Icon icon="ep:upload-filled" />{{ title }}</el-button>
<template v-if="isShowTip" #tip> <template v-if="isShowTip" #tip>
<div style="font-size: 8px"> <div style="font-size: 8px">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
@ -68,6 +68,10 @@ const uploadHeaders = ref({
Authorization: 'Bearer ' + getAccessToken(), Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId() 'tenant-id': getTenantId()
}) })
//
const filename = ref<string>('');
// //
const beforeUpload: UploadProps['beforeUpload'] = (file: UploadRawFile) => { const beforeUpload: UploadProps['beforeUpload'] = (file: UploadRawFile) => {
if (fileList.value.length >= props.limit) { if (fileList.value.length >= props.limit) {
@ -93,18 +97,20 @@ const beforeUpload: UploadProps['beforeUpload'] = (file: UploadRawFile) => {
} }
message.success('正在上传文件,请稍候...') message.success('正在上传文件,请稍候...')
uploadNumber.value++ uploadNumber.value++
filename.value = file.name
} }
// // ,
// const handleFileChange = (uploadFile: UploadFile): void => { // const handleFileChange: UploadProps['onChange'] = (res: any): void => {
// uploadRef.value.data.path = uploadFile.name // console.log(res);
// filename.value = res.name
// } // }
// //
const handleFileSuccess: UploadProps['onSuccess'] = (res: any): void => { const handleFileSuccess: UploadProps['onSuccess'] = (res: any): void => {
message.success('上传成功') // , (todo)!!
const fileListNew = fileList.value const fileListNew = fileList.value
fileListNew.pop() fileListNew.pop()
fileList.value = fileListNew fileList.value = fileListNew
uploadList.value.push({ name: res.data, url: res.data }) uploadList.value.push({ name: filename.value, url: res.data })
if (uploadList.value.length == uploadNumber.value) { if (uploadList.value.length == uploadNumber.value) {
fileList.value = fileList.value.concat(uploadList.value) fileList.value = fileList.value.concat(uploadList.value)
uploadList.value = [] uploadList.value = []
@ -136,7 +142,9 @@ const listToString = (list: UploadUserFile[], separator?: string) => {
let strs = '' let strs = ''
separator = separator || ',' separator = separator || ','
for (let i in list) { for (let i in list) {
strs += list[i].url + separator if(list[i].url != undefined) {
strs += list[i].url + separator
}
} }
return strs != '' ? strs.substr(0, strs.length - 1) : '' return strs != '' ? strs.substr(0, strs.length - 1) : ''
} }

@ -254,6 +254,13 @@ export enum DICT_TYPE {
CONTRACT_COST_MAIN = 'contract_cost_main', // 合同费用承担主体 CONTRACT_COST_MAIN = 'contract_cost_main', // 合同费用承担主体
CONTRACT_BIDDING_STATUS = 'contract_bidding_status', // 合同招投标状态 CONTRACT_BIDDING_STATUS = 'contract_bidding_status', // 合同招投标状态
CONTRACT_LONGTERM_STATUS = 'contract_longterm_status', // 合同长协 CONTRACT_LONGTERM_STATUS = 'contract_longterm_status', // 合同长协
CONTRACT_MAIN_BODY_TYPE = 'contract_main_body_type', // 合同主体类型
CONTRACT_PAYMENT_METHOD = 'contract_payment_method', // 合同付款方式
CONTRACT_COOPERATION_METHOD = 'contract_cooperation_method', // 合同合作方式
CONTRACT_SETTLEMENT_METHOD = 'contract_settlement_method', // 合同结算方式
CONTRACT_PAYMENT_NODE = 'contract_payment_node', // 合同收付款节点
CONTRACT_CLAUSE_TYPE = 'contract_clause_type', // 合同条款类型
CONTRACT_TEMPLATE_TYPE = 'contract_template_type', // 合同模板类型
CONTRACT_CLAUSE_STATUS = 'contract_clause_status', // 合同条款状态
CONTRACT_TEMPLATE_STATUS = 'contract_clause_status', // 合同模板状态
} }

@ -0,0 +1,321 @@
<template>
<el-card class="box-card xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>编辑企业</span>
<span><span style="color:red;">*</span>为必填项</span>
</div>
</template>
<div class="text item">
<el-row>
<el-col :span="24">
<div class="xy-info-title-a1">
<span class="xy-icon"></span><span class="xy-text">基础信息</span>
</div>
</el-col>
</el-row>
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px" class="demo-ruleForm" :size="formSize" status-icon>
<el-row style="width:95%">
<el-col :span="8">
<el-form-item label="企业代码" prop="name">
<el-input v-model="ruleForm.word" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="企业名称" prop="name">
<el-input v-model="ruleForm.firm" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="企业简称/英文名称">
<el-input v-model="ruleForm.name" placeholder="默认企业名称拼音首字母" />
</el-form-item>
</el-col>
</el-row>
<el-row style="width:95%">
<el-col :span="8">
<el-form-item label="主体类型" prop="region">
<el-select v-model="ruleForm.region" clearable placeholder="主体类型" style="width:100%">
<el-option label="企业" value="shanghai" />
<el-option label="个体户" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在城市" prop="count">
<el-select v-model="ruleForm.region" clearable placeholder="所在城市" style="width:100%">
<el-option label="企业" value="shanghai" />
<el-option label="个体户" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行业分类" clearable prop="count">
<el-select v-model="ruleForm.region" clearable placeholder="行业类型" style="width:100%">
<el-option label="企业" value="shanghai" />
<el-option label="个体户" value="beijing" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row style="width:95%">
<el-col :span="8">
<el-form-item label="首联系人" prop="name">
<el-input v-model="ruleForm.date1" placeholder="输入内容" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="职位">
<el-input v-model="ruleForm.date1" placeholder="输入内容" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="手机号码" prop="phone">
<el-input v-model="ruleForm.date1" placeholder="输入内容" />
</el-form-item></el-col>
</el-row>
<el-row>
<el-col :span="24">
<div class="xy-info-title-a1">
<span class="xy-icon"></span><span class="xy-text">联系人信息</span>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="企业LOGO" prop="">
<el-upload style="margin-top:50px" class="avatar-uploader" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="16">
<el-row>
<el-col :span="11">
<el-form-item label="详细地址" prop="name">
<el-input v-model="ruleForm.date1" placeholder="输入内容" />
</el-form-item></el-col>
<el-col :span="11">
<el-form-item label="企业电话" prop="phone">
<el-input v-model="ruleForm.date1" placeholder="输入内容" />
</el-form-item></el-col>
<el-col :span="11">
<el-form-item label="企业传真" prop="name">
<el-input v-model="ruleForm.date1" placeholder="输入内容" />
</el-form-item></el-col>
<el-col :span="11">
<el-form-item label="企业网址" prop="phone">
<el-input v-model="ruleForm.date1" placeholder="输入网址">
<template #prepend>Http://</template>
</el-input>
</el-form-item></el-col>
<el-col :span="22
">
<el-form-item label="企业介绍" prop="phone">
<el-input v-model="ruleForm.desc" maxlength="300" :autosize="{ minRows: 6, maxRows: 8 }" show-word-limit type="textarea" placeholder="输入内容" />
</el-form-item></el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div class="xy-info-title-a1">
<span class="xy-icon"></span><span class="xy-text">财务信息</span>
</div>
</el-col>
</el-row>
<el-row style="width:95%">
<el-col :span="8">
<el-form-item label="企业税号" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票抬头" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容"/>
</el-form-item>
</el-col>
</el-row>
<el-row style="width:95%">
<el-col :span="8">
<el-form-item label="银行账号" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="电话号码" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="注册地址" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容"/>
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item>
<el-button style="width:120px;height:40px" type="primary" @click="submitForm(ruleFormRef)">
保存
</el-button>
<el-button style="width:120px;height:40px" @click="backtrack()"></el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-card>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
// import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
let router = useRouter()
const message = useMessage() //
const { t } = useI18n() //
interface RuleForm {
word:any
firm:any
name: any
region: any
count: any
date1: any
desc: any
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({
word:'2023191110001',
firm:'济钢城市矿产科技有限公司',
name: '',
region: '',
count: '',
date1: '',
desc: ''
})
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: '请输入内容', trigger: 'blur' },
{ min: 1, max: 11, message: '输入1-11个字', trigger: 'blur' }
],
region: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
count: [
{
required: true,
message: '请选择',
trigger: 'change'
}
]
})
//
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('新建submit校验成功 返回上一页!')
router.push('./index.vue') //
} else {
console.log('error submit!', fields)
}
})
}
const backtrack = () => {
router.push('./index.vue') //
}
const options = Array.from({ length: 10000 }).map((_, idx) => ({
value: `${idx + 1}`,
label: `${idx + 1}`
}))
</script>
<style scoped lang="scss">
.box-card {
border-radius: 10px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.xy-info-title-a1 {
padding: 14px;
line-height: 28px;
font-weight: 500;
.xy-icon {
font-family: '阿里巴巴普惠体 2.0 65 Medium', '阿里巴巴普惠体 2.0 55', '阿里巴巴普惠体 2.0',
sans-serif;
color: #409eff;
}
.xy-text {
padding-left: 5px;
color: #666666;
}
}
.el-row {
margin: 20px 0;
}
.el-table--border .el-table__cell {
border-right: none;
}
.avatar-uploader .avatar {
width: 120px;
height: 120px;
display: block;
}
</style>
<style >
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
text-align: center;
}
</style>

@ -0,0 +1,94 @@
<template>
<el-card class="xy-card">
<div class="iconcentere">
<el-icon class="icon"><CircleCheck /></el-icon>
<el-row>
<el-col>
<p class="z1">操作成功</p>
<span class="z2">企业信息提交成功</span>
</el-col>
</el-row>
</div>
<el-row class="row">
<el-col :span="8">
<p>企业代码{{mydata[0].k1}}</p>
</el-col>
<el-col :span="8">
<p>创建人员{{mydata[0].k2}}</p>
</el-col>
<el-col :span="8">
<p>创建时间{{mydata[0].k3}}</p></el-col>
</el-row>
<el-row justify="center" style="margin-top:150px">
<el-col :span="2">
<el-button type="primary" @click="goback" style="height:40px"> {{ countdown > 0 ? `${countdown}秒后返回详情` : '返回详情' }}</el-button>
</el-col>
</el-row>
</el-card>
</template>
<script setup lang="ts">
import {reactive} from 'vue';
import { CircleCheck } from '@element-plus/icons-vue'
const mydata =reactive([
{k1:'202309110001',k2:'康宁',k3:'2023-10-19 14:01'}
])
const router = useRouter()
const countdown = ref(5)
onMounted(() => {
//
const timer = setInterval(() => {
countdown.value--
if (countdown.value === 0) {
clearInterval(timer)
goBack()
}
}, 1000)
})
const goBack = () => {
//
// router.push('/src/views/xxjj/enterpriseDetails/index.vue')
//
router.back()
}
</script>
<style scoped lang="scss">
.row{
height: 120px;
padding: 40px;
border-radius: 10px;
box-sizing: border-box;
background-color: rgba(249, 249, 249, 1);
font-size: 14px;
color: #666666;
}
.z1{
font-size: 22px;
color: rgb(102, 102, 102);
}
.z2{
font-size: 14px;
color: #999999;
}
.xy-card{
padding: 100px;
border-radius: 10px;
}
.iconcentere{
height: 250px;
text-align: center;
.icon{
font-size: 80px;
color: #7ED96D;
}
}
</style>

@ -0,0 +1,223 @@
<template>
<el-card class="box-card xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>认证引导页</span>
<span><span style="color:red;">*</span>为必填项</span>
</div>
</template>
<div class="itemcard">
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon>
<el-row style="margin-bottom:20px">
<el-col :span="24">
<div class="xy-info-title-a1 ">
<span class="xy-icon"></span><span class="xy-text">基础信息</span>
</div>
</el-col>
</el-row>
<el-row>
<el-col>
<el-form-item label="主体类型:" prop="radio1">
<el-radio-group v-model="ruleForm.radio1" size="large">
<el-radio-button label="企业" />
<el-radio-button label="个体户" />
<el-radio-button label="政府及事业单位" />
<el-radio-button label="其他组织" />
<el-radio-button label="个人" />
</el-radio-group>
</el-form-item>
</el-col>
<el-form-item label="主体类型:" prop="radio2">
<el-radio-group v-model="ruleForm.radio2" size="large">
<el-radio-button label="法人" />
<el-radio-button label="代办人" />
</el-radio-group>
</el-form-item>
<!-- </el-form> -->
</el-row>
<el-row>
<el-col :span="24">
<div class="xy-info-title-a1 b1">
<div>
<span class="xy-icon"></span><span class="xy-text">按照以下清单准备资料</span>
</div>
<el-button>下载全部资料模板</el-button>
</div>
</el-col>
</el-row>
<el-row>
<el-col>
<div class="custom-table">
<table>
<thead>
<tr>
<th style="width:10%;"></th>
<th>客户资质</th>
<th>简单描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>统一社会信用代码证</td>
<td>-</td>
</tr>
</tbody>
<tbody>
<tr>
<td>2</td>
<td>法人证件照正反面照片法人手持证件照</td>
<td style="text-align: left; padding-left:20px">
<p>证件包含身份证护照来往内地通行证等有效证件</p>
<p>· 照片标准四角完整清晰可辨若加水印需保证照片重要信息清晰可辨</p>
<p>· 法人证件非大陆身份证如护照等需要提供法人证明函</p>
</td>
</tr>
</tbody>
</table>
</div>
</el-col>
</el-row>
<el-row justify="center" style="margin-top:50px">
<el-col :span="5">
<el-form-item prop="type">
<el-checkbox-group v-model="ruleForm.type">
<el-checkbox label="我已阅读并同意协议《云息服务协议》" name="type" />
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item>
<el-button type="primary" @click="submitForm(ruleFormRef)">
材料准备就绪,立即开始认证
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-card>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import { useRouter } from 'vue-router'
import { ElButton } from 'element-plus'
const router = useRouter()
interface RuleForm {
radio1: any
radio2: any
type: any
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const radio1 = ref('')
const ruleForm = reactive<RuleForm>({
radio1: '企业',
radio2: '法人',
type: []
})
const rules = reactive<FormRules<RuleForm>>({
radio1: [
{
required: true,
message: '选择一个',
trigger: 'change'
}
],
radio2: [
{
required: true,
message: '选择一个',
trigger: 'change'
}
],
type: [
{
type: 'array',
required: true,
message: '请勾选',
trigger: 'change'
}
]
})
//
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
// console.log('submit !')
router.push('./mainmessage.vue')
} else {
console.log('error submit!', fields)
}
})
}
</script>
<style scoped lang="scss">
.box-card {
border-radius: 10px;
}
.b1 {
display: flex;
justify-content: space-between;
}
.xy-info-title-a1 {
padding: 14px;
line-height: 28px;
font-weight: 500;
.xy-icon {
font-family: '阿里巴巴普惠体 2.0 65 Medium', '阿里巴巴普惠体 2.0 55', '阿里巴巴普惠体 2.0',
sans-serif;
color: #409eff;
}
.xy-text {
padding-left: 5px;
color: #666666;
}
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.itemcard {
width: 80%;
margin: 0 auto;
}
//bg
.custom-table {
margin: 20px;
}
table {
width: 100%;
border-collapse: collapse;
}
thead th {
height: 60px;
background-color: #409eff;
color: white;
border: 1px solid white;
}
tbody td {
// background-color: white;
color: #666666;
border: 1px solid #409eff;
text-align: center;
height: 60px;
}
</style>

@ -0,0 +1,286 @@
<template>
<el-card class="box-card xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>认证企业</span>
<span><span style="color:red;">*</span>为必填项</span>
</div>
</template>
<div class="itemcard">
<el-row style="justify-content: center;">
<el-col :span="17">
<el-steps :active="2" align-center>
<el-step title="主体信息" description="请填写主体信息" />
<el-step title="法定代表人信息" description="请填写法定代表人信息" />
<el-step title="经营信息" description="请填写经营信息" />
<el-step title="提交成功" description="信息提交成功" />
</el-steps>
</el-col>
</el-row>
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px" class="demo-ruleForm" :size="formSize" status-icon>
<el-row style="width:95%;margin-top:50px">
<el-col>
<el-form-item label="实际操作人:" prop="name">
<el-radio-group v-model="ruleForm.radio2" size="large">
<el-radio-button label="法人" />
<el-radio-button label="代办人" />
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24" style="margin:20px 0;">
<div class="xy-info-title-a1">
<div>
<span class="xy-icon"></span><span class="xy-text">法定代表人证件照<span style="font-size:12px;margin-left:5px;">你可上传身份证护照来往内地通行证等有效证件</span></span>
</div>
</div>
</el-col>
<el-col :span="12">
<el-form-item label="证件照正面:" prop="">
<el-upload class="avatar-uploader" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
<el-col>
<span style="font-size:12px;color:#999999;">如你的证件类型是身份证请在此处上传人像面<a href="#" style="color: rgb(64, 158, 255);">查看示例</a></span>
</el-col>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="证件照反面:" prop="">
<el-upload class="avatar-uploader" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
<el-col>
<span style="font-size:12px;color:#999999;">如你的证件类型是身份证请在此处上传国徽面<a href="#" style="color: rgb(64, 158, 255);">查看示例</a></span>
</el-col>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="手持证件照:" prop="">
<el-upload class="avatar-uploader" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
<el-col>
<span style="font-size:12px;color:#999999;"><a href="#" style="color: rgb(64, 158, 255);">查看示例</a></span>
</el-col>
</el-form-item>
</el-col>
<el-col :span="24" style="margin:20px 0;">
<div class="xy-info-title-a1">
<div>
<span class="xy-icon"></span><span class="xy-text">法定代表人信息 </span>
</div>
</div>
</el-col>
<el-col :span="12">
<el-col>
<el-form-item label="证件类型" prop="region">
<el-select v-model="ruleForm.region" clearable placeholder="主体类型" style="width:100%">
<el-option label="身份证" value="shanghai" />
<el-option label="护照" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="证件号码" prop="region">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="证件有效期:" prop="name">
<el-radio-group v-model="ruleForm.radio2" size="large">
<el-radio-button label="非长期" />
<el-radio-button label="长期" />
</el-radio-group>
</el-form-item>
</el-col>
<el-col>
<el-form-item prop="name">
<el-date-picker v-model="value2" type="daterange" start-placeholder="" end-placeholder="" :default-value="[new Date(2010, 9, 1), new Date(2010, 10, 1)]" />
</el-form-item>
</el-col>
</el-col>
<el-col :span="12">
<el-col>
<el-form-item label="法定代表人姓名:" prop="firm">
<el-input v-model="ruleForm.firm" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="出生日期" prop="name">
<el-date-picker v-model="value1" type="date" placeholder="选择日期" :default-value="new Date(2010, 9, 1)" />
</el-form-item>
</el-col>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="12">
<el-form-item>
<el-button style="width:120px;height:40px" type="primary" plain @click="goback()">
上一步
</el-button>
<el-button style="width:120px;height:40px" type="primary" @click="submitForm(ruleFormRef)">
下一步
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-card>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
// import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
let router = useRouter()
const message = useMessage() //
const { t } = useI18n() //
interface RuleForm {
word: any
firm: any
name: any
region: any
count: any
date1: any
desc: any
radio2: any
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({
word: '2023191110001',
firm: '济钢城市矿产科技有限公司',
name: '',
region: '',
count: '',
date1: '',
desc: '',
radio2: '法人'
})
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: '请输入内容', trigger: 'blur' },
{ min: 1, max: 11, message: '输入1-11个字', trigger: 'blur' }
],
region: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
count: [
{
required: true,
message: '请选择',
trigger: 'change'
}
]
})
//
const goback = ()=>{
router.back()
}
//
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('新建submit校验成功 去指定页面!')
router.push('./operatemessage.vue') //
} else {
console.log('error submit!', fields)
}
})
}
const options = Array.from({ length: 10000 }).map((_, idx) => ({
value: `${idx + 1}`,
label: `${idx + 1}`
}))
</script>
<style scoped lang="scss">
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.itemcard {
width: 80%;
margin: 0 auto;
}
.box-card {
border-radius: 10px;
}
.xy-info-title-a1 {
padding: 14px;
line-height: 28px;
font-weight: 500;
.xy-icon {
font-family: '阿里巴巴普惠体 2.0 65 Medium', '阿里巴巴普惠体 2.0 55', '阿里巴巴普惠体 2.0',
sans-serif;
color: #409eff;
}
.xy-text {
padding-left: 5px;
color: #666666;
}
}
.el-row {
margin: 20px 0;
}
.el-table--border .el-table__cell {
border-right: none;
}
.avatar-uploader .avatar {
width: 120px;
height: 120px;
display: block;
}
</style>
<style >
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
text-align: center;
}
</style>

@ -0,0 +1,284 @@
<template>
<el-card class="box-card xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>认证企业</span>
<span><span style="color:red;">*</span>为必填项</span>
</div>
</template>
<div class="itemcard">
<el-row style="justify-content: center;">
<el-col :span="17">
<el-steps :active="1" align-center>
<el-step title="主体信息" description="请填写主体信息" />
<el-step title="法定代表人信息" description="请填写法定代表人信息" />
<el-step title="经营信息" description="请填写经营信息" />
<el-step title="提交成功" description="信息提交成功" />
</el-steps>
</el-col>
</el-row>
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px" class="demo-ruleForm" :size="formSize" status-icon>
<el-row style="width:95%;margin-top:50px">
<el-col :span="12">
<el-col>
<el-form-item label="主体类型:" prop="region">
<el-select v-model="ruleForm.region" clearable placeholder="主体类型" style="width:100%">
<el-option label="企业" value="shanghai" />
<el-option label="个体户" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="注册地址:" prop="region2">
<el-select v-model="ruleForm.region2" clearable placeholder="选择城市" style="width:100%">
<el-option label="企业" value="shanghai" />
<el-option label="个体户" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col>
<el-form-item prop="name">
<el-input v-model="ruleForm.address" placeholder="详细地址" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="社会统一信用代码:" prop="name">
<el-input v-model="ruleForm.date1" placeholder="
" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="经营期限:" prop="radio2">
<el-radio-group v-model="ruleForm.radio2" size="large">
<el-radio-button label="非长期" />
<el-radio-button label="长期" />
</el-radio-group>
</el-form-item>
<el-form-item>
<el-date-picker style="width:100%" v-model="ruleForm.date" type="daterange" start-placeholder="" end-placeholder="" :default-time="defaultTime" />
</el-form-item>
</el-col>
</el-col>
<el-col :span="12">
<el-col>
<el-form-item label="企业名称:" prop="name">
<el-input v-model="ruleForm.firm" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="经营范围:" >
<el-input v-model="ruleForm.desc" maxlength="300" :autosize="{ minRows: 3, maxRows: 3 }" show-word-limit type="textarea" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="上传证件照片:" prop="pic">
<el-upload class="avatar-uploader" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
<div>
<span style="font-size:13px;color:#999999;">请上传统一社会信用代码证</span><br>
<span style="font-size:12px;color:#999999;">必须为彩色图片且小于6M,文件格式为bmppngjpegjpg或gif<a href="#" style="color: rgb(64, 158, 255);">查看示例</a></span>
</div>
</el-form-item>
</el-col>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="12">
<el-form-item>
<el-button style="width:120px;height:40px" type="primary" plain @click="goback()">
上一步
</el-button>
<el-button style="width:120px;height:40px" type="primary" @click="submitForm(ruleFormRef)">
下一步
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-card>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
// import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
let router = useRouter()
const message = useMessage() //
const { t } = useI18n() //
interface RuleForm {
address:any
word: any
firm: any
name: any
region: any
count: any
date1: any
desc: any
radio2:any
pic:any
region2:any
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({
word: '2023191110001',
firm: '济钢城市矿产科技有限公司',
name: '',
region: '',
region2:'',
count: '',
date1: '',
desc: '',
radio2:'',
pic:'',
address:''
})
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: '请输入内容', trigger: 'blur' },
{ min: 1, max: 11, message: '输入1-11个字', trigger: 'blur' }
],
address:[
{ required: true, message: '请输入内容', trigger: 'blur' },
{ min: 1, max: 11, message: '输入1-11个字', trigger: 'blur' }
],
region: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
region2: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
count: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
radio2: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
pic:[
{
required: true,
message: '请选择',
trigger: 'change'
}
],
})
//
const goback = ()=>{
router.back()
}
//
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('新建submit校验成功 去指定页面!')
router.push('./legalmessage.vue') //
} else {
console.log('error submit!', fields)
}
})
}
const options = Array.from({ length: 10000 }).map((_, idx) => ({
value: `${idx + 1}`,
label: `${idx + 1}`
}))
</script>
<style scoped lang="scss">
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.itemcard {
width: 80%;
margin: 0 auto;
}
.box-card {
border-radius: 10px;
}
.xy-info-title-a1 {
padding: 14px;
line-height: 28px;
font-weight: 500;
.xy-icon {
font-family: '阿里巴巴普惠体 2.0 65 Medium', '阿里巴巴普惠体 2.0 55', '阿里巴巴普惠体 2.0',
sans-serif;
color: #409eff;
}
.xy-text {
padding-left: 5px;
color: #666666;
}
}
.el-row {
margin: 20px 0;
}
.el-table--border .el-table__cell {
border-right: none;
}
.avatar-uploader .avatar {
width: 120px;
height: 120px;
display: block;
}
</style>
<style >
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
text-align: center;
}
</style>

@ -0,0 +1,106 @@
<template>
<el-card class="xy-card">
<div class="iconcentere">
<el-icon class="icon"><CircleCheck /></el-icon>
<el-row>
<el-col>
<p class="z1">操作成功</p>
<span class="z2">企业信息提交成功</span>
</el-col>
</el-row>
</div>
<el-row class="row" justify="center">
<el-col :span="8">
<p>企业代码{{mydata[0].k1}}</p>
</el-col>
<el-col :span="8">
<p>创建人员{{mydata[0].k2}}</p>
</el-col>
<el-col :span="4">
<p>创建时间{{mydata[0].k3}}</p>
</el-col>
<el-col>
<el-steps :active="3" align-center>
<el-step title="提交申请" :description="mydata[0].k3" />
<el-step title="信息确认" :description="mydata[0].k3" />
<el-step title="提交认证" :description="mydata[0].k3" />
<el-step title="平台审核" description="等待审批" />
<el-step title="购买商品" description="等待审批" />
<el-step title="开通成功" description="等待审批" />
</el-steps>
</el-col>
</el-row>
<el-row justify="center" style="margin-top:150px">
<el-col :span="2">
<el-button type="primary" @click="goback" style="height:40px"> {{ countdown > 0 ? `${countdown}秒后返回详情` : '返回详情' }}</el-button>
</el-col>
</el-row>
</el-card>
</template>
<script setup lang="ts">
import {reactive} from 'vue';
import { CircleCheck } from '@element-plus/icons-vue'
import path from 'path';
const mydata =reactive([
{k1:'202309110001',k2:'康宁',k3:'2023-10-19 14:01'}
])
const router = useRouter()
const countdown = ref(5)
onMounted(() => {
//
const timer = setInterval(() => {
countdown.value--
if (countdown.value === 0) {
clearInterval(timer)
goBack()
}
}, 1000)
})
const goBack = () => {
//
router.push('../enterpriseDetails/index.vue');
//
router.back()
}
</script>
<style scoped lang="scss">
.row{
height: 300px;
padding: 40px;
border-radius: 10px;
box-sizing: border-box;
background-color: rgba(249, 249, 249, 1);
font-size: 14px;
color: #666666;
}
.z1{
font-size: 22px;
color: rgb(102, 102, 102);
}
.z2{
font-size: 14px;
color: #999999;
}
.xy-card{
padding: 100px;
border-radius: 10px;
}
.iconcentere{
height: 250px;
text-align: center;
.icon{
font-size: 80px;
color: #7ED96D;
}
}
</style>

@ -0,0 +1,252 @@
<template>
<el-card class="box-card xy-card xy-margin-zero">
<template #header>
<div class="card-header">
<span>认证企业</span>
<span><span style="color:red;">*</span>为必填项</span>
</div>
</template>
<div class="itemcard">
<el-row style="justify-content: center;">
<el-col :span="17">
<el-steps :active="3" align-center>
<el-step title="主体信息" description="请填写主体信息" />
<el-step title="法定代表人信息" description="请填写法定代表人信息" />
<el-step title="经营信息" description="请填写经营信息" />
<el-step title="提交成功" description="信息提交成功" />
</el-steps>
</el-col>
</el-row>
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px" class="demo-ruleForm" :size="formSize" status-icon>
<el-row style="width:95%;margin-top:50px">
<el-col :span="24" style="margin:20px 0;">
<div class="xy-info-title-a1">
<div>
<span class="xy-icon"></span><span class="xy-text">联系人信息</span>
</div>
</div>
</el-col>
<el-col :span="12">
<el-form-item label="姓名:" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号:" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="常用邮箱:" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="24" style="margin:20px 0;">
<div class="xy-info-title-a1">
<div>
<span class="xy-icon"></span><span class="xy-text">财务信息</span>
</div>
</div>
</el-col>
<el-col :span="12">
<el-col>
<el-form-item label="企业税号:" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="开户银行:" prop="name">
<el-input v-model="ruleForm.name" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="电话号码:" prop="name">
<el-radio-group v-model="ruleForm.radio2" size="large">
<el-radio-button label="非长期" />
<el-radio-button label="长期" />
</el-radio-group>
</el-form-item>
</el-col>
</el-col>
<el-col :span="12">
<el-col>
<el-form-item label="发票抬头:" prop="name">
<el-input v-model="ruleForm.firm" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="银行账号:" prop="name">
<el-input v-model="ruleForm.firm" />
</el-form-item>
</el-col>
<el-col>
<el-form-item label="注册地址:" prop="name">
<el-input v-model="ruleForm.firm" />
</el-form-item>
</el-col>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="12">
<el-form-item>
<el-button style="width:120px;height:40px" type="primary" plain @click="goback()">
上一步
</el-button>
<el-button style="width:120px;height:40px" type="primary" @click="submitForm(ruleFormRef)">
下一步
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-card>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
// import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
let router = useRouter()
const message = useMessage() //
const { t } = useI18n() //
interface RuleForm {
word: any
firm: any
name: any
region: any
count: any
date1: any
desc: any
radio2: any
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({
word: '2023191110001',
firm: '济钢城市矿产科技有限公司',
name: '',
region: '',
count: '',
date1: '',
desc: '',
radio2: '法人'
})
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: '请输入内容', trigger: 'blur' },
{ min: 1, max: 11, message: '输入1-11个字', trigger: 'blur' }
],
region: [
{
required: true,
message: '请选择',
trigger: 'change'
}
],
count: [
{
required: true,
message: '请选择',
trigger: 'change'
}
]
})
//
const goback = ()=>{
router.back()
}
//
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('新建submit校验成功')
router.push('./okmessage.vue') //
} else {
console.log('error submit!', fields)
}
})
}
const options = Array.from({ length: 10000 }).map((_, idx) => ({
value: `${idx + 1}`,
label: `${idx + 1}`
}))
</script>
<style scoped lang="scss">
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.itemcard {
width: 80%;
margin: 0 auto;
}
.box-card {
border-radius: 10px;
}
.xy-info-title-a1 {
padding: 14px;
line-height: 28px;
font-weight: 500;
.xy-icon {
font-family: '阿里巴巴普惠体 2.0 65 Medium', '阿里巴巴普惠体 2.0 55', '阿里巴巴普惠体 2.0',
sans-serif;
color: #409eff;
}
.xy-text {
padding-left: 5px;
color: #666666;
}
}
.el-row {
margin: 20px 0;
}
.el-table--border .el-table__cell {
border-right: none;
}
.avatar-uploader .avatar {
width: 120px;
height: 120px;
display: block;
}
</style>
<style >
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
text-align: center;
}
</style>

@ -36,7 +36,7 @@
<el-row style="width:95%"> <el-row style="width:95%">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="隶属业务线" clearable prop="count"> <el-form-item label="隶属业务线" clearable prop="count">
<el-select v-model="ruleForm.region" clearable placeholder="选择类型"> <el-select style="width:100%" v-model="ruleForm.region" clearable placeholder="选择类型">
<el-option label="业务线" value="shanghai" /> <el-option label="业务线" value="shanghai" />
<el-option label="业务线" value="beijing" /> <el-option label="业务线" value="beijing" />
</el-select> </el-select>
@ -44,7 +44,7 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="类型" prop="region"> <el-form-item label="类型" prop="region">
<el-select v-model="ruleForm.region" clearable placeholder="选择类型"> <el-select style="width:100%" v-model="ruleForm.region" clearable placeholder="选择类型">
<el-option label="业务线" value="shanghai" /> <el-option label="业务线" value="shanghai" />
<el-option label="业务线" value="beijing" /> <el-option label="业务线" value="beijing" />
</el-select> </el-select>
@ -53,7 +53,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="所在城市" prop="count"> <el-form-item label="所在城市" prop="count">
<el-select-v2 v-model="ruleForm.count" placeholder="选择城市" :options="options" /> <el-select-v2 style="width:100%" v-model="ruleForm.count" placeholder="选择城市" :options="options" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -314,7 +314,7 @@
<el-dialog v-model="dialogFormVisible" :title="dialogTitle" width="30%" @closed="closed(ruleFormRef)"> <el-dialog v-model="dialogFormVisible" :title="dialogTitle" width="30%" @closed="closed(ruleFormRef)">
<el-form ref="ruleFormRef" :model="ContactruleForm" :rules="Contactrules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon> <el-form ref="ruleFormRef" :model="ContactruleForm" :rules="Contactrules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon>
<el-form-item label="联系人类型:" prop="region"> <el-form-item label="联系人类型:" prop="region">
<el-select v-model="ContactruleForm.data" placeholder="类型"> <el-select style="width:100%" v-model="ContactruleForm.data" placeholder="类型">
<el-option label="Zone one" value="shanghai" /> <el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" /> <el-option label="Zone two" value="beijing" />
</el-select> </el-select>
@ -353,7 +353,7 @@
<el-dialog v-model="addressVisible" :title="addressdialogTitle" width="30%" @closed="closed(ruleFormRef)"> <el-dialog v-model="addressVisible" :title="addressdialogTitle" width="30%" @closed="closed(ruleFormRef)">
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon> <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon>
<el-form-item label="类型:" prop="region"> <el-form-item label="类型:" prop="region">
<el-select v-model="ruleForm.region" placeholder="类型"> <el-select style="width:100%" v-model="ruleForm.region" placeholder="类型">
<el-option label="默认地址" value="shanghai" /> <el-option label="默认地址" value="shanghai" />
<el-option label="注册地址" value="beijing" /> <el-option label="注册地址" value="beijing" />
<el-option label="生产地址" value="beijing" /> <el-option label="生产地址" value="beijing" />
@ -361,7 +361,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="国家/地区:" prop="region"> <el-form-item label="国家/地区:" prop="region">
<el-select v-model="ruleForm.region" placeholder="类型"> <el-select style="width:100%" v-model="ruleForm.region" placeholder="类型">
<el-option label="默认地址" value="shanghai" /> <el-option label="默认地址" value="shanghai" />
<el-option label="注册地址" value="beijing" /> <el-option label="注册地址" value="beijing" />
<el-option label="生产地址" value="beijing" /> <el-option label="生产地址" value="beijing" />
@ -369,7 +369,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="省份/城市/区:" prop="region"> <el-form-item label="省份/城市/区:" prop="region">
<el-select v-model="ruleForm.region" placeholder="类型"> <el-select style="width:100%" v-model="ruleForm.region" placeholder="类型">
<el-option label="默认地址" value="shanghai" /> <el-option label="默认地址" value="shanghai" />
<el-option label="注册地址" value="beijing" /> <el-option label="注册地址" value="beijing" />
<el-option label="生产地址" value="beijing" /> <el-option label="生产地址" value="beijing" />
@ -397,7 +397,7 @@
<el-dialog v-model="spaceVisible" :title="spacedialogTitle" width="30%" @closed="closed(ruleFormRef)"> <el-dialog v-model="spaceVisible" :title="spacedialogTitle" width="30%" @closed="closed(ruleFormRef)">
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon> <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm" :size="formSize" status-icon>
<el-form-item label="货区类型:" prop="region"> <el-form-item label="货区类型:" prop="region">
<el-select v-model="ruleForm.region" placeholder="类型"> <el-select style="width:100%" v-model="ruleForm.region" placeholder="类型">
<el-option label="默认地址" value="shanghai" /> <el-option label="默认地址" value="shanghai" />
<el-option label="注册地址" value="beijing" /> <el-option label="注册地址" value="beijing" />
<el-option label="生产地址" value="beijing" /> <el-option label="生产地址" value="beijing" />
@ -405,7 +405,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="是否可售:" prop="region"> <el-form-item label="是否可售:" prop="region">
<el-select v-model="ruleForm.region" placeholder="类型"> <el-select style="width:100%" v-model="ruleForm.region" placeholder="类型">
<el-option label="可售" value="shanghai" /> <el-option label="可售" value="shanghai" />
<el-option label="不可售" value="beijing" /> <el-option label="不可售" value="beijing" />
</el-select> </el-select>

@ -39,6 +39,7 @@
<el-select v-model="formData.diffFlag" clearable placeholder="选择类型"> <el-select v-model="formData.diffFlag" clearable placeholder="选择类型">
<el-option label="业务线" value="0" /> <el-option label="业务线" value="0" />
<el-option label="仓库" value="1" /> <el-option label="仓库" value="1" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>

@ -0,0 +1,167 @@
<template>
<el-card class="build-contract">
<template #header>
<div class="header">
<div>
<span style="margin-right: 10px;">生成合同</span>
<small> ( <span style="color: #f56c6c;">*</span> 为必填项 )</small>
</div>
<el-button type="primary" text @click="() => { }">预览合同</el-button>
</div>
</template>
<div class="content">
<div class="lead">
<div class="title">
<span class="lc"></span>
<span class="lh">合同类型</span>
</div>
<div class="tips">
<el-alert title="不同的合同类型可编辑的字段内容不同,合同类型一旦保存不可修改,请选择更匹配你需求的一个。" type="warning" />
</div>
<div class="types">
<el-button-group>
<template v-for="item in contract_types" :key="item.value">
<el-button :type="item.value == activeType ? 'primary' : 'default'" class="type"
:class="item.value == activeType ? 'active' : ''" @click="changeContractType(item.value)">{{ item.label
}}</el-button>
</template>
<!-- <el-button type="default" class="type">销售合同</el-button>
<el-button type="default" class="type">仓储合同</el-button> -->
</el-button-group>
</div>
</div>
<div class="form-area">
<ProcureContract />
</div>
</div>
<div class="footer">
<el-divider />
<div class="options">
<el-button type="primary" style="width: 120px;" size="large">保存</el-button>
<el-button type="default" style="width: 120px;" size="large" plain>返回</el-button>
</div>
</div>
</el-card>
</template>
<script setup lang="ts" name="BuildContract">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import * as ContractApi from '@/api/xxjj/contract'
import ProcureContract from './components/types/procure/ProcureContract.vue'
const { t } = useI18n() //
const message = useMessage() //
const contract_types = ref<any>([]);
const activeType = ref('1');
onMounted(() => {
contract_types.value = getStrDictOptions(DICT_TYPE.CONTRACT_TYPE)
console.log(contract_types);
});
//
const changeContractType = (typeVal) => {
activeType.value = typeVal
}
</script>
<style lang="scss" scoped>
.build-contract {
width: 100%;
margin-bottom: 15px;
::v-deep {
.el-card__header {
background-color: rgba(249, 249, 249, 1);
font-size: 18px;
}
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
}
.content {
width: 100%;
max-height: 1500px;
overflow-y: scroll;
overflow-x: hidden;
.lead {
width: 100%;
padding: 0 20px;
margin-bottom: 50px;
.title {
margin-bottom: 10px;
display: flex;
align-items: center;
.lc {
width: 8px;
height: 16px;
background-color: #409eff;
margin-right: 10px;
display: inline-block;
}
.lh {
color: #666;
font-size: 16px;
font-weight: 700;
display: inline-block;
}
}
.tips {
width: 50%;
margin-bottom: 10px;
}
.types {
margin-top: 10px;
::v-deep(.el-button) {
&:hover {
background-color: #fff;
}
&:focus {
background-color: #409eff;
}
}
.type {
width: 120px;
height: 60px;
color: #999;
padding: 20px;
}
.active {
color: #fff;
}
}
}
.form-area {
padding: 0 20px;
height: 1500px;
}
}
.footer {
height: 100px;
.options {
display: flex;
align-items: center;
justify-content: center;
}
}
}
</style>

@ -0,0 +1,37 @@
<template>
<div class="tree-and-table">
左树右表弹框
</div>
</template>
<script setup lang="ts" name="TreeAndTable">
const emits = defineEmits(['changeRange']);
const props = defineProps<{
name: string
}>();
const ranges = reactive([
{
day: 0,
text: '今天'
},
{
day: 1,
text: '昨天'
},
{
day: 7,
text: '最近7天'
},
{
day: 30,
text: '最近30天'
}
]);
</script>
<style lang="scss">
.tree-and-table {
width: 100%;
}
</style>

@ -0,0 +1,55 @@
<template>
<div class="annexinfo_a">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large"
label-position="top">
<el-row justify="start" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="合同附件" prop="contractAppendices">
<UploadFile v-model="formData.contractAppendices" :title="config.title" :limit="config.limit"
:file-size="config.fileSize" :file-type="config.fileType" />
<!-- <el-input v-model="formData.contractAppendices" placeholder="合同附件" v-show="false" /> -->
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附属文件" prop="ancillaryDocuments">
<UploadFile v-model="formData.ancillaryDocuments" :title="config.title" :limit="config.limit"
:file-size="config.fileSize" :file-type="config.fileType" />
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-button @click="() => { console.log(formData) }">查看</el-button>
</el-col> -->
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts" name="AnnexInfo_A">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref<any>({ //
contractAppendices: [],
ancillaryDocuments: [],
})
const formRules = reactive({ //
contractAppendices: [{ required: false, message: '合同附件不能为空', trigger: 'blur' }],
ancillaryDocuments: [{ required: false, message: '附属文件不能为空', trigger: 'blur' }],
})
const config = reactive({
title: "上传文件",
fileType: ['rar', 'zip', 'doc', 'docx', 'pdf'],
fileSize: 20,
limit: 4,
});
</script>
<style lang="scss" scoped>
.annexinfo_a {
width: 100%;
}
</style>

@ -0,0 +1,101 @@
<template>
<div class="baseinfo_a">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large" label-position="top">
<el-row justify="start" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="合同模版" prop="contractTemplateId">
<el-input v-model="formData.contractTemplateId" placeholder="请选择合同模版" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contractNumber">
<el-input v-model="formData.contractNumber" placeholder="点击后生成合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contractName">
<el-input v-model="formData.contractName" placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="对方合同编号" prop="contractNo">
<el-input v-model="formData.contractNo" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签订地点" prop="contractSigned">
<el-input v-model="formData.contractSigned" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签订时间" prop="contractSignedTime">
<el-input v-model="formData.contractSignedTime" placeholder="选择日期" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="关联业务线" prop="businessId">
<el-select v-model="formData.businessId" placeholder="请选择业务类型" style="width: 100%;">
<el-option label="业务线" value="1">业务线1</el-option>
<el-option label="业务线" value="2">业务线2</el-option>
<el-option label="业务线" value="3">业务线3</el-option>
<el-option label="业务线" value="4">业务线4</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="业务类型" prop="businessType">
<el-select v-model="formData.businessType" placeholder="请选择业务类型" style="width: 100%;">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_BUSINESS_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申报时间" prop="declarationTime">
<el-date-picker v-model="formData.declarationTime" type="date" value-format="x" placeholder="选择申报时间"
style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts" name="BaseInfo_A">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const emits = defineEmits(["setContractId"]);
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref({ //
contractTemplateId: undefined,
contractNumber: undefined,
contractName: undefined,
contractNo: undefined,
contractSigned: undefined,
contractSignedTime: undefined,
businessId: undefined,
businessType: undefined,
declarationTime: undefined
})
const formRules = reactive({ //
contractTemplateId: [{ required: true, message: '合同模板未选择', trigger: 'blur' }],
contractNumber: [{ required: true, message: '合同编号不能为空', trigger: 'blur' }],
contractName: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }],
contractNo: [{ required: false, message: '对方合同编号不能为空', trigger: 'blur' }],
contractSigned: [{ required: true, message: '签订地点不能为空', trigger: 'blur' }],
contractSignedTime: [{ required: true, message: '签订时间不能为空', trigger: 'blur' }],
businessId: [{ required: true, message: '关联业务线不能为空', trigger: 'blur' }],
businessType: [{ required: true, message: '业务类型不能为空', trigger: 'change' }],
declarationTime: [{ required: true, message: '申报时间不能为空', trigger: 'blur' }]
})
</script>
<style lang="scss" scoped>
.baseinfo_a {
width: 100%;
}
</style>

@ -0,0 +1,95 @@
<template>
<div class="commoditylist_a">
<div class="stats">
<span> 商品共 <b class="dag">0</b> 总数 <b class="dag">0</b>合计不含税小计 <b class="dag">0.00</b> 合计含税小计 <b
class="dag">0.00</b> </span>
</div>
<el-card class="box-card">
<el-table :data="tableData" stripe style="width: 100%" size="large" fit>
<template #empty>
<el-empty :image-size="80" description="尚未添加商品信息" />
</template>
<el-table-column label="操作" align="center" width="150px" fixed="left">
<template #default="scope">
<el-button link type="danger" @click="removeCommodityItem(scope.index)">
<el-icon><Remove /></el-icon>
</el-button>
</template>
</el-table-column>
<el-table-column prop="a" label="商品名称" />
<el-table-column prop="b" label="规格" width="150" />
<el-table-column prop="c" label="库存单位" width="150" />
<el-table-column prop="d" label="采购单位" width="150"/>
<el-table-column prop="e" label="数量" width="150" />
<el-table-column prop="f" label="税率" width="150" />
<el-table-column prop="g" label="含税单价" width="150" />
<el-table-column prop="h" label="含税总金额" width="150" />
</el-table>
<div class="add" @click="addCommodityItem">
<el-button link type="primary">
<el-icon><CirclePlus /></el-icon>
<span style="margin-left: 5px;">添加商品</span>
</el-button>
</div>
</el-card>
</div>
</template>
<script setup lang="ts" name="CommodityList_A">
import { Remove, CirclePlus } from '@element-plus/icons-vue'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
// const props = defineProps({
// contractId: {
// type: Number,
// require: false,
// default: 10001
// }
// });
const tableData = reactive([
// {
// a: "",
// b: "330/",
// c: "",
// d: "",
// e: 3,
// f: 0.05,
// g: 100,
// h: 300,
// }
]);
const removeCommodityItem = (index) => {
console.log(index);
}
const addCommodityItem = () => {
console.log(123465);
}
</script>
<style lang="scss" scoped>
.commoditylist_a {
width: 100%;
.stats {
text-align: left;
margin-bottom: 20px;
.dag {
color: #F56C6C;
cursor: pointer;
}
}
.add {
cursor: pointer;
margin-top: 20px;
border: 1px dashed #999;
height: 40px;
font-size: 20px;
display: flex;
align-items: center;
justify-content: center;
}
}
</style>

@ -0,0 +1,83 @@
<template>
<div class="deliveryinfo_a">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large"
label-position="top">
<el-row justify="start" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="交货时间" prop="deliveryTime">
<el-date-picker v-model="formData.deliveryTime" type="date" value-format="x" placeholder="选择日期范围"
style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="交货方式" prop="deliveryModel">
<el-select v-model="formData.deliveryModel" placeholder="交货方式" style="width: 100%;">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_DELIVERY_MODEL)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="交货地点" prop="deliveryLocation">
<el-input v-model="formData.deliveryLocation" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="运输方式" prop="modeTransport">
<el-select v-model="formData.modeTransport" placeholder="运输方式" style="width: 100%;">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_MODE_TRANSPORT)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="配送方式" prop="deliveryMethod">
<el-select v-model="formData.deliveryMethod" placeholder="配送方式" style="width: 100%;">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_DELIVERY_METHOD)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="费用承担主体" prop="costBearingMian">
<el-select v-model="formData.costBearingMian" placeholder="费用承担主体" style="width: 100%;">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_COST_MAIN)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts" name="DeliveryInfo_A">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref({ //
deliveryTime: undefined,
deliveryModel: undefined,
deliveryLocation: undefined,
modeTransport: undefined,
deliveryMethod: undefined,
costBearingMian: undefined,
})
const formRules = reactive({ //
deliveryTime: [{ required: true, message: '交货时间不能为空', trigger: 'blur' }],
deliveryModel: [{ required: true, message: '交货方式不能为空', trigger: 'blur' }],
deliveryLocation: [{ required: true, message: '交货地点不能为空', trigger: 'blur' }],
modeTransport: [{ required: true, message: '运输方式不能为空', trigger: 'blur' }],
deliveryMethod: [{ required: true, message: '配送方式不能为空', trigger: 'blur' }],
costBearingMian: [{ required: true, message: '费用承担主体不能为空', trigger: 'blur' }],
})
</script>
<style lang="scss" scoped>
.deliveryinfo_a {
width: 100%;
}
</style>

@ -0,0 +1,131 @@
<template>
<div class="extendinfo_a">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large"
label-position="top">
<el-row justify="start" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="长协合同" prop="contractAgreement">
<el-input v-model="formData.contractAgreement" placeholder="是否合同模版" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="安全协议" prop="securityProtocol">
<el-input v-model="formData.securityProtocol" placeholder="输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否招投标" prop="bidding">
<el-input v-model="formData.bidding" placeholder="是否招投标" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="扩展字段" prop="extendedField">
<el-input v-model="formData.extendedField" placeholder="扩展信息" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同标签" prop="contractLabel">
<!-- <el-input v-model="formData.contractLabel" placeholder="输入内容" /> -->
<el-select v-model="formData.contractLabel" multiple filterable allow-create default-first-option
:reserve-keyword="false" placeholder="合同标签" style="width: 100%;">
<el-option v-for="item in labelList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合同要求" prop="contractRequirement">
<el-input v-model="formData.contractRequirement" type="textarea" placeholder="输入内容" :rows="10" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注一" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="输入内容" :rows="10" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注二" prop="remark2">
<el-input v-model="formData.remark2" type="textarea" placeholder="输入内容" :rows="10" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item>
<el-button type="primary" @click="() => console.log(formData)">提交</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts" name="ExtendInfo_A">
import { Select } from '@element-plus/icons-vue'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
// const props = defineProps({
// contractId: {
// type: Number,
// require: false,
// default: 10001
// }
// });
// const selectMainBodyInfo = (index) => {
// console.log(index);
// }
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref({ //
contractAgreement: undefined,
securityProtocol: undefined,
extendedField: undefined,
bidding: undefined,
contractLabel: undefined,
contractRequirement: undefined,
remark: undefined,
remark2: undefined,
})
const formRules = reactive({ //
contractAgreement: [{ required: true, message: '长协合同未选择', trigger: 'blur' }],
securityProtocol: [{ required: true, message: '安全协议不能为空', trigger: 'blur' }],
bidding: [{ required: false, message: '是否招投标未选择', trigger: 'blur' }],
extendedField: [{ required: false, message: '扩展信息不能为空', trigger: 'blur' }],
contractLabel: [{ required: false, message: '合同标签不能为空', trigger: 'blur' }],
contractRequirement: [{ required: true, message: '合同要求不能为空', trigger: 'blur' }],
remark: [{ required: false, message: '备注一不能为空', trigger: 'blur' }],
remark2: [{ required: false, message: '备注一不能为空', trigger: 'change' }],
})
const labelList = reactive(
[
{
value: '1',
label: '标签1',
},
{
value: '2',
label: '标签2',
},
{
value: '3',
label: '标签1',
},
{
value: '4',
label: '标签4',
},
{
value: '5',
label: '标签5',
},
]
);
</script>
<style lang="scss" scoped>
.extendinfo_a {
width: 100%;
}
</style>

@ -0,0 +1,159 @@
<template>
<div class="financeinfo_a">
<el-form ref="formRef2" :model="formData2" :rules="formRules2" v-loading="formLoading2"
size="large">
<el-row justify="center" :gutter="50">
<el-col :span="24">
<el-card class="box-card">
<el-table :data="tableData" stripe style="width: 100%" size="large" fit :cell-style="{'padding': '24px 0 0 0'}">
<el-table-column prop="mainName" label="主体">
<template #default>
<el-form-item prop="mainName">
<el-tooltip class="box-item" effect="dark" :content="formData2.mainName"
:visible="formData2.mainName.trim().length > 0" placement="top">
<el-input v-model="formData2.mainName" placeholder="主体" />
</el-tooltip>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="paymentMethod" label="付款方式">
<template #default>
<el-form-item prop="paymentMethod">
<el-input v-model="formData2.paymentMethod" placeholder="付款方式" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="cooperationMethod" label="合作方式">
<template #default>
<el-form-item prop="cooperationMethod">
<el-input v-model="formData2.cooperationMethod" placeholder="合作方式" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="settlementMethod" label="结算方式">
<template #default>
<el-form-item prop="settlementMethod">
<el-input v-model="formData2.settlementMethod" placeholder="结算方式" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="advanceRatio" label="预付比例">
<template #default>
<el-form-item prop="advanceRatio">
<el-input v-model="formData2.advanceRatio" placeholder="预付比例" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="underpaymentMethod" label="压款方式">
<template #default>
<el-form-item prop="underpaymentMethod">
<el-input v-model="formData2.underpaymentMethod" placeholder="压款方式" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="depositMethod" label="保证金方式">
<template #default>
<el-form-item prop="depositMethod">
<el-input v-model="formData2.depositMethod" placeholder="保证金方式" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="overdueInterestRate" label="逾期利率">
<template #default>
<el-form-item prop="overdueInterestRate">
<el-input v-model="formData2.overdueInterestRate" placeholder="逾期利率" />
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-form>
<div style="height: 30px;" content="gap"></div>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large"
label-position="top">
<el-row justify="start" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="合计金额(人民币)" prop="totalAmount">
<el-input v-model="formData.totalAmount" placeholder="自动计算" disabled>
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="大写金额(人民币) " prop="amountCapitalization">
<el-input v-model="formData.amountCapitalization" placeholder="自动编写" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts" name="FinanceInfo_A">
import { Select } from '@element-plus/icons-vue'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const props = defineProps({
contractId: {
type: Number,
require: false,
default: 10001
}
});
const tableData = reactive([
{
mainBody: '甲方',
mainBodyType: 1, //
contractId: props.contractId,
mainName: "--",
representativeName: "--",
socialUnifiedInformationCode: "--",
updateTime: "--"
}
]);
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref({ //
totalAmount: undefined,
amountCapitalization: undefined,
});
const formRules = reactive({ //
totalAmount: [{ required: true, message: '合计金额不能为空', trigger: 'blur' }],
amountCapitalization: [{ required: true, message: '大写金额不能为空', trigger: 'blur' }],
})
const formRef2 = ref() // Ref
const formLoading2 = ref(false) //
const formData2 = ref({ //
mainName: '',
paymentMethod: undefined,
cooperationMethod: undefined,
settlementMethod: undefined,
advanceRatio: undefined,
accountPeriod: undefined,
underpaymentMethod: undefined,
depositMethod: undefined,
overdueInterestRate: undefined,
})
const formRules2 = reactive({ //
mainName: [{ required: true, message: '主体名称不能为空', trigger: 'blur' }],
paymentMethod: [{ required: true, message: '付款方式不能为空', trigger: 'blur' }],
cooperationMethod: [{ required: true, message: '合作方式不能为空', trigger: 'blur' }],
settlementMethod: [{ required: true, message: '结算方式不能为空', trigger: 'blur' }],
advanceRatio: [{ required: true, message: '预付比例不能为空', trigger: 'blur' }],
accountPeriod: [{ required: true, message: '账期不能为空', trigger: 'blur' }],
underpaymentMethod: [{ required: true, message: '压款方式不能为空', trigger: 'blur' }],
depositMethod: [{ required: true, message: '保证金方式不能为空', trigger: 'change' }],
overdueInterestRate: [{ required: true, message: '逾期利率不能为空', trigger: 'blur' }]
})
</script>
<style lang="scss" scoped>
.financeinfo_a {
width: 100%;
}
</style>

@ -0,0 +1,141 @@
<template>
<div class="paymentnodes_a">
<el-card class="box-card">
<el-form :model="formData" ref="formRef" :rules="formRules" v-loading="formLoading" size="large">
<el-table :data="formData.dataList" stripe style="width: 100%" size="large" fit empty-text="" @current-change="changeRowIndex">
<el-table-column prop="paymentNode" label="收付款节点" width="180" class-name="cellstyle">
<template #default="{ row, $index }">
<!-- {{$index}} -->
<el-form-item :prop="'dataList.'+ $index + '.paymentNode'" :rules="formRules.paymentNode">
<el-input v-model="row.paymentNode" placeholder="主体" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="paymentMethod" label="收付款方式" width="180" class-name="cellstyle">
<template #default="{ row, $index }">
<el-form-item :prop="'dataList.'+ $index + '.paymentMethod'" :rules="formRules.paymentMethod">
<el-input v-model="row.paymentMethod" placeholder="收付款方式" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="paymentRatio" label="付款比例" width="180" class-name="cellstyle">
<template #default="{ row, $index }">
<el-form-item :prop="'dataList.'+ $index + '.paymentRatio'" :rules="formRules.paymentRatio">
<el-input v-model="row.paymentRatio" placeholder="付款比例" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="price" label="金额" width="180" class-name="cellstyle">
<template #default="{ row, $index }">
<el-form-item :prop="'dataList.'+ $index + '.price'" :rules="formRules.price">
<el-input v-model="row.price" placeholder="金额" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" class-name="cellstyle">
<template #default="{ row, $index }">
<el-form-item :prop="'dataList.'+ $index + '.remark'" :rules="formRules.remark">
<el-input v-model="row.remark" placeholder="备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" width="150px" fixed="left">
<template #default="scope">
<el-button link type="primary" @click="deletePaymentNote(scope.index)">
<el-icon>
<Delete />
</el-icon>
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<div class="add" @click="addPaymentNote">
<el-button link type="primary">
<el-icon>
<CirclePlus />
</el-icon>
<span style="margin-left: 5px;">添加节点</span>
</el-button>
</div>
</el-card>
</div>
</template>
<script setup lang="ts" name="PaymentNodes_A">
import { Delete, CirclePlus } from '@element-plus/icons-vue'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const props = defineProps({
contractId: {
type: Number,
require: false,
default: 10001
}
});
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref({ //
dataList: [
{
contractId: props.contractId,
paymentNode: '12345',
paymentMethod: '',
paymentRatio: '',
price: '',
remark: '',
},
{
contractId: props.contractId,
paymentNode: '',
paymentMethod: '',
paymentRatio: '',
price: '',
remark: '',
}
]
});
const formRules = reactive({ //
paymentNode: [{ required: true, message: '收付款节点不能为空', trigger: 'blur' }],
paymentMethod: [{ required: true, message: '收付款方式不能为空', trigger: 'blur' }],
paymentRatio: [{ required: false, message: '付款比例不能为空', trigger: 'blur' }],
price: [{ required: true, message: '金额不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '备注不能为空', trigger: 'blur' }],
})
const deletePaymentNote = (index) => {
console.log(index);
}
const addPaymentNote = () => {
console.log(123456);
}
const changeRowIndex = (currentRow, oldCurrentRow) => {
console.log(currentRow, oldCurrentRow);
}
</script>
<style lang="scss" scoped>
.paymentnodes_a {
width: 100%;
.add {
cursor: pointer;
margin-top: 20px;
border: 1px dashed #999;
height: 40px;
font-size: 20px;
display: flex;
align-items: center;
justify-content: center;
}
::v-deep(td.cellstyle) {
padding: 24px 0 0 0 !important;
}
}
</style>

@ -0,0 +1,67 @@
<template>
<div class="primaryinfo_a">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large" label-position="top">
<el-row justify="start" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="币种" prop="currency">
<el-input v-model="formData.currency" placeholder="请选择币种" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="采购模式" prop="procurementModel">
<el-input v-model="formData.procurementModel" placeholder="请选择采购模式" />
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="关联销售合同" prop="contractName">
<el-input v-model="formData.contractName" placeholder="点击关联销售合同" />
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="定价模式" prop="pricingModel">
<el-input v-model="formData.pricingModel" placeholder="定价模式" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="关联供应商/客户" prop="subject">
<el-input v-model="formData.subject" placeholder="点击关联供应商/客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同期限" prop="contractPeriodTime">
<el-input v-model="formData.contractPeriodTime" placeholder="合同期限" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts" name="PrimaryInfo_A">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const formRef = ref() // Ref
const formLoading = ref(false) //
const formData = ref({ //
currency: undefined,
procurementModel: undefined,
pricingModel: undefined,
subject: undefined,
contractPeriodTime: undefined,
})
const formRules = reactive({ //
currency: [{ required: true, message: '交易币种不能为空', trigger: 'blur' }],
procurementModel: [{ required: true, message: '采购模式不能为空', trigger: 'blur' }],
pricingModel: [{ required: true, message: '定价模式不能为空', trigger: 'blur' }],
subject: [{ required: true, message: '关联供应商/客户不能为空', trigger: 'blur' }],
contractPeriodTime: [{ required: true, message: '合同期限不能为空', trigger: 'blur' }],
})
</script>
<style lang="scss" scoped>
.primaryinfo_a {
width: 100%;
}
</style>

@ -0,0 +1,149 @@
<template>
<div class="procure-contract">
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">基本信息</span>
</div>
<div class="content">
<BaseInfo_A @setContractId="genContractId"/>
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">主体信息</span>
</div>
<div class="content">
<!-- <SubjectInfo_A :contract-id="contractId"/> -->
<SubjectInfo_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">合同信息</span>
</div>
<div class="content">
<PrimaryInfo_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">交货信息</span>
</div>
<div class="content">
<DeliveryInfo_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">商品明细</span>
</div>
<div class="content">
<CommodityList_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">财务信息</span>
</div>
<div class="content">
<FinanceInfo_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">付款节点</span>
</div>
<div class="content">
<PaymentNodes_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">附件信息</span>
</div>
<div class="content">
<AnnexInfo_A />
</div>
</div>
<div class="item-area">
<div class="title">
<span class="lc"></span>
<span class="lh">其他信息</span>
</div>
<div class="content">
<ExtendInfo_A />
</div>
</div>
</div>
</template>
<script setup lang="ts" name="ProcureContract">
import BaseInfo_A from './BaseInfo_A.vue'
import SubjectInfo_A from './SubjectInfo_A.vue'
import PrimaryInfo_A from './PrimaryInfo_A.vue'
import DeliveryInfo_A from './DeliveryInfo_A.vue'
import CommodityList_A from './CommodityList_A.vue'
import FinanceInfo_A from './FinanceInfo_A.vue'
import PaymentNodes_A from './PaymentNodes_A.vue'
import AnnexInfo_A from './AnnexInfo_A.vue'
import ExtendInfo_A from './ExtendInfo_A.vue'
//
const contractId = ref<number>(0);
const genContractId = (cid) => {
contractId.value = cid;
}
</script>
<style lang="scss" scoped>
.procure-contract {
width: 100%;
.item-area {
width: 100%;
margin-bottom: 50px;
.title {
margin-bottom: 10px;
display: flex;
align-items: center;
.lc {
width: 8px;
height: 16px;
background-color: #409eff;
margin-right: 10px;
display: inline-block;
}
.lh {
color: #666;
font-size: 16px;
font-weight: 700;
display: inline-block;
}
}
}
.content {
margin-top: 30px;
}
}
</style>

@ -0,0 +1,148 @@
<template>
<div class="subjectinfo_a">
<!-- <el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading" size="large" label-position="top">
<el-row justify="center" style="flex-wrap: wrap;" :gutter="50">
<el-col :span="8">
<el-form-item label="合同模版" prop="contractTemplateId">
<el-input v-model="formData.contractTemplateId" placeholder="请选择合同模版" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contractNumber">
<el-input v-model="formData.contractNumber" placeholder="点击后生成合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contractName">
<el-input v-model="formData.contractName" placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="对方合同编号" prop="contractNo">
<el-input v-model="formData.contractNo" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签订地点" prop="contractSigned">
<el-input v-model="formData.contractSigned" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签订时间" prop="contractSignedTime">
<el-input v-model="formData.contractSignedTime" placeholder="选择日期" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="关联业务线" prop="businessId">
<el-select v-model="formData.businessId" placeholder="请选择业务类型" style="width: 100%;">
<el-option label="业务线" value="1">业务线1</el-option>
<el-option label="业务线" value="2">业务线2</el-option>
<el-option label="业务线" value="3">业务线3</el-option>
<el-option label="业务线" value="4">业务线4</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="业务类型" prop="businessType">
<el-select v-model="formData.businessType" placeholder="请选择业务类型" style="width: 100%;">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_BUSINESS_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申报时间" prop="declarationTime">
<el-date-picker v-model="formData.declarationTime" type="date" value-format="x" placeholder="选择申报时间"
style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
</el-form> -->
<el-card class="box-card">
<el-table :data="tableData" stripe style="width: 100%" size="large" fit>
<el-table-column prop="mainBody" label="主体" width="180" />
<el-table-column prop="mainName" label="主体名称" />
<el-table-column prop="representativeName" label="法定代表人" />
<el-table-column prop="socialUnifiedInformationCode" label="社会统一信息代码" />
<el-table-column prop="updateTime" label="更新时间" width="180" />
<el-table-column label="操作" align="center" width="150px" fixed="right">
<template #default="scope">
<el-button link type="primary" @click="selectMainBodyInfo(scope.index)">
<el-icon><Select /></el-icon>
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script setup lang="ts" name="SubjectInfo_A">
import { Select } from '@element-plus/icons-vue'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
const props = defineProps({
contractId: {
type: Number,
require: false,
default: 10001
}
});
const tableData = reactive([
{
mainBody: '甲方',
mainBodyType: 1, //
contractId: props.contractId,
mainName: "--",
representativeName: "--",
socialUnifiedInformationCode: "--",
updateTime: "--"
},
{
mainBody: '乙方',
mainBodyType: 2, //
contractId: props.contractId,
mainName: "--",
representativeName: "--",
socialUnifiedInformationCode: "--",
updateTime: "--"
}
]);
const selectMainBodyInfo = (index) => {
console.log(index);
}
// const formRef = ref() // Ref
// const formLoading = ref(false) //
// const formData = ref({ //
// contractTemplateId: undefined,
// contractNumber: undefined,
// contractName: undefined,
// contractNo: undefined,
// contractSigned: undefined,
// contractSignedTime: undefined,
// businessId: undefined,
// businessType: undefined,
// declarationTime: undefined
// })
// const formRules = reactive({ //
// contractTemplateId: [{ required: true, message: '', trigger: 'blur' }],
// contractNumber: [{ required: true, message: '', trigger: 'blur' }],
// contractName: [{ required: true, message: '', trigger: 'blur' }],
// contractNo: [{ required: false, message: '', trigger: 'blur' }],
// contractSigned: [{ required: true, message: '', trigger: 'blur' }],
// contractSignedTime: [{ required: true, message: '', trigger: 'blur' }],
// businessId: [{ required: true, message: '线', trigger: 'blur' }],
// businessType: [{ required: true, message: '', trigger: 'change' }],
// declarationTime: [{ required: true, message: '', trigger: 'blur' }]
// })
</script>
<style lang="scss" scoped>
.subjectinfo_a {
width: 100%;
}
</style>

@ -41,7 +41,7 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item> <el-form-item>
<el-button type="primary" plain @click="bulidContract" v-hasPermi="['xxjj:contract:create']"> <el-button type="primary" plain @click="bulidContract" v-hasPermi="['xxjj:contract:add']">
<Icon icon="ep:plus" class="mr-5px" /> 生成合同 <Icon icon="ep:plus" class="mr-5px" /> 生成合同
</el-button> </el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading" <el-button type="success" plain @click="handleExport" :loading="exportLoading"
@ -149,6 +149,7 @@ import DrawerFilter from './components/DrawerFilter.vue'
import tempImg from '@/assets/imgs/contract.png'; import tempImg from '@/assets/imgs/contract.png';
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
const router = useRouter(); //
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
@ -194,7 +195,7 @@ const resetQuery = () => {
// formRef.value.open(type, id) // formRef.value.open(type, id)
// } // }
const bulidContract = () => { const bulidContract = () => {
console.log(123456); router.push({name: 'BuildContract'});
} }
const editContract = (id) => { const editContract = (id) => {

@ -0,0 +1,127 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-form-item label="条款标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入条款标题" />
</el-form-item>
<el-form-item label="条款类型" prop="type">
<el-select v-model="formData.type" placeholder="请选择条款类型">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_CLAUSE_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_CLAUSE_STATUS)" :key="dict.value"
:label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="条款内容">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="权重值" prop="weight">
<el-input v-model="formData.weight" placeholder="请输入权重值" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="formData.attachment" placeholder="请输入附件" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import * as ContractClauseApi from '@/api/xxjj/contractClause'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
title: undefined,
type: undefined,
status: undefined,
content: undefined,
weight: undefined,
remark: undefined,
attachment: undefined
})
const formRules = reactive({
title: [{ required: true, message: '条款标题不能为空', trigger: 'blur' }],
type: [{ required: true, message: '条款类型', trigger: 'change' }],
status: [{ required: true, message: '状态', trigger: 'blur' }],
content: [{ required: true, message: '条款内容不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ContractClauseApi.getContractClause(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as ContractClauseApi.ContractClauseVO
if (formType.value === 'create') {
await ContractClauseApi.createContractClause(data)
message.success(t('common.createSuccess'))
} else {
await ContractClauseApi.updateContractClause(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
title: undefined,
type: undefined,
status: undefined,
content: undefined,
weight: undefined,
remark: undefined,
attachment: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,171 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<el-form-item label="条款标题" prop="title">
<el-input v-model="queryParams.title" placeholder="请输入条款标题" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="条款类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择条款类型" clearable class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_CLAUSE_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_CLAUSE_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['xxjj:contract-clause:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:contract-clause:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="编号" align="center" prop="id" width="150px" />
<el-table-column label="条款标题" align="center" prop="title" width="150px" />
<el-table-column label="条款类型" align="center" prop="type" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CONTRACT_CLAUSE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CONTRACT_CLAUSE_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="条款内容" align="center" prop="content" width="150px" />
<el-table-column label="权重值" align="center" prop="weight" width="150px" />
<el-table-column label="备注" align="center" prop="remark" width="150px" />
<el-table-column label="附件" align="center" prop="attachment" width="150px" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="150px" />
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:contract-clause:update']">
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['xxjj:contract-clause:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ContractClauseForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="ContractClause">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as ContractClauseApi from '@/api/xxjj/contractClause'
import ContractClauseForm from './ContractClauseForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
title: null,
type: null,
status: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ContractClauseApi.getContractClausePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ContractClauseApi.deleteContractClause(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ContractClauseApi.exportContractClause(queryParams)
download.excel(data, '合同条款.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,118 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading">
<el-form-item label="模板名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入模板名称" />
</el-form-item>
<el-form-item label="合同模板类型" prop="type">
<el-select v-model="formData.type" placeholder="请选择合同模板类型">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_TEMPLATE_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_TEMPLATE_STATUS)" :key="dict.value"
:label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="模板描述" prop="describe">
<el-input v-model="formData.describe" placeholder="请输入模板描述" />
</el-form-item>
<el-form-item label="配置项" prop="options">
<el-input v-model="formData.options" placeholder="请输入配置项" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import * as ContractTemplateApi from '@/api/xxjj/contractTemplate'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
name: undefined,
type: undefined,
status: undefined,
describe: undefined,
options: undefined
})
const formRules = reactive({
name: [{ required: true, message: '模板名称不能为空', trigger: 'blur' }],
type: [{ required: true, message: '合同模板类型 参考字典contract_template_type不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态 参考字典contract_template_status不能为空', trigger: 'blur' }],
describe: [{ required: true, message: '模板描述不能为空', trigger: 'blur' }],
options: [{ required: true, message: '配置项 json格式不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ContractTemplateApi.getContractTemplate(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as ContractTemplateApi.ContractTemplateVO
if (formType.value === 'create') {
await ContractTemplateApi.createContractTemplate(data)
message.success(t('common.createSuccess'))
} else {
await ContractTemplateApi.updateContractTemplate(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
name: undefined,
type: undefined,
status: undefined,
describe: undefined,
options: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,172 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<el-form-item label="模板名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入模板名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="合同模板类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择合同模板类型" clearable
class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_TEMPLATE_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable
class="!w-240px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.CONTRACT_TEMPLATE_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['xxjj:contract-template:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:contract-template:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" fit>
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="编号" align="center" prop="id" width="150px" />
<el-table-column label="模板名称" align="center" prop="name" />
<el-table-column label="合同模板类型" align="center" prop="type" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CONTRACT_TEMPLATE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status" width="150px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CONTRACT_TEMPLATE_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<!-- <el-table-column label="模板描述" align="center" prop="describe" width="150px" /> -->
<!-- <el-table-column label="配置项 json格式" align="center" prop="options" width="150px" /> -->
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="210px" />
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:contract-template:update']">
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)"
v-hasPermi="['xxjj:contract-template:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ContractTemplateForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="ContractTemplate">
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as ContractTemplateApi from '@/api/xxjj/contractTemplate'
import ContractTemplateForm from './ContractTemplateForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
name: null,
type: null,
status: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ContractTemplateApi.getContractTemplatePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ContractTemplateApi.deleteContractTemplate(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ContractTemplateApi.exportContractTemplate(queryParams)
download.excel(data, '合同模板.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -110,6 +110,7 @@
<el-tab-pane label="服务商信息" name="eighth"><ProviderInfo /></el-tab-pane> <el-tab-pane label="服务商信息" name="eighth"><ProviderInfo /></el-tab-pane>
<el-tab-pane label="操作记录" name="ninth"><OperateRecords /></el-tab-pane> <el-tab-pane label="操作记录" name="ninth"><OperateRecords /></el-tab-pane>
<el-tab-pane label="补充" name="tenth"><Replenish /></el-tab-pane> <el-tab-pane label="补充" name="tenth"><Replenish /></el-tab-pane>
<el-tab-pane label="补充2" name="ten2th"><Replenish2 /></el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</div> </div>
@ -125,6 +126,7 @@ import SupplierInfo from './src/SupplierInfo.vue'
import ProviderInfo from './src/ProviderInfo.vue' import ProviderInfo from './src/ProviderInfo.vue'
import OperateRecords from './src/OperateRecords.vue' import OperateRecords from './src/OperateRecords.vue'
import Replenish from './src/infopage/replenish.vue' import Replenish from './src/infopage/replenish.vue'
import Replenish2 from './src/infopage2/replenish.vue'
import { ArrowDown } from '@element-plus/icons-vue' import { ArrowDown } from '@element-plus/icons-vue'
import { getCurrentInstance, onMounted, reactive, ref, toRefs } from 'vue' import { getCurrentInstance, onMounted, reactive, ref, toRefs } from 'vue'
import headerImg from '@/assets/imgs/logo.png' import headerImg from '@/assets/imgs/logo.png'

Loading…
Cancel
Save