Forráskód Böngészése

Merge branch 'crm5.1' of hongze/hongze_mobile_admin into master

hsun 3 éve
szülő
commit
8b2ced5d4a

+ 1 - 0
controllers/admin.go

@@ -73,6 +73,7 @@ func (c *AdminCommon) Login() {
 	}
 	resp.ProductName = productName
 	resp.Authority = adminWx.Authority
+	resp.Headimgurl = adminWx.Headimgurl
 	c.OkDetailed(resp, "登录成功")
 }
 

+ 25 - 0
controllers/contract.go

@@ -7,6 +7,7 @@ import (
 	contractResp "hongze/hongze_mobile_admin/models/response/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval"
+	"hongze/hongze_mobile_admin/models/tables/contract_relation"
 	contractService "hongze/hongze_mobile_admin/services/contract"
 	"hongze/hongze_mobile_admin/services/seal"
 	"hongze/hongze_mobile_admin/utils"
@@ -431,6 +432,30 @@ func (c *ContractCommon) ListBySeal() {
 		c.FailWithMessage("获取合同列表失败", "获取合同列表失败,Err:"+err.Error())
 		return
 	}
+	if len(list) > 0 {
+		// 代付合同查询代付用户名称
+		contractIdSlice := make([]string, 0)
+		for i := 0; i < len(list); i ++ {
+			if list[i].ContractBusinessType == "代付合同" {
+				contractIdSlice = append(contractIdSlice, strconv.Itoa(list[i].ContractId))
+			}
+		}
+		contractIdStr := strings.Join(contractIdSlice, ",")
+		contractList, err := contract_relation.GetContractRelationListByPaymentOnBehalfContractIds(contractIdStr)
+		if err != nil {
+			c.FailWithMessage("获取失败", "获取代付合同对应的合同数据失败,Err:"+err.Error())
+			return
+		}
+		userCompanyNameMap := make(map[int]string, 0)
+		for i := 0; i < len(contractList); i ++ {
+			userCompanyNameMap[contractList[i].PaymentOnBehalfContractId] = contractList[i].CompanyName
+		}
+		for _, item := range list {
+			if item.ContractBusinessType == "代付合同" {
+				item.UseCompanyName = userCompanyNameMap[item.ContractId]
+			}
+		}
+	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
 

+ 65 - 39
controllers/seal.go

@@ -33,21 +33,32 @@ func (c *SealCommon) Add() {
 		return
 	}
 
-	//参数校验
-	paramVerify := utils.Rules{
-		"Use":         {utils.NotEmpty()},
-		"CompanyName": {utils.NotEmpty()},
-		"CreditCode":  {utils.NotEmpty()},
-		"ServiceType": {utils.NotEmpty()},
-		"SealType":    {utils.NotEmpty()},
-		"FileUrl":     {utils.NotEmpty()},
+	// 参数校验
+	if req.Use == "" {
+		c.FailWithMessage("用印用途不能为空", "用印用途不能为空")
+		return
 	}
-	err = utils.Verify(req, paramVerify, utils.LANG_CN)
-
-	if err != nil {
-		c.FailWithMessage("缺少参数", err.Error())
+	if req.CompanyName == "" {
+		c.FailWithMessage("客户名称不能为空", "客户名称不能为空")
+		return
+	}
+	if req.CreditCode == "" {
+		c.FailWithMessage("社会统一信用代码不能为空", "社会统一信用代码不能为空")
+		return
+	}
+	if req.ServiceType == "" {
+		c.FailWithMessage("合同类型不能为空", "合同类型不能为空")
+		return
+	}
+	if req.SealType == "" {
+		c.FailWithMessage("印章类型不能为空", "印章类型不能为空")
 		return
 	}
+	if req.FileUrl == "" {
+		c.FailWithMessage("合同附件不能为空", "合同附件不能为空")
+		return
+	}
+
 	sealInfo, err := sealService.AddSeal(c.AdminWx.AdminId, req.ContractId, req.FileNum, c.AdminWx.RealName, req.Use, req.UseCompanyName, req.CompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrl)
 	if err != nil {
 		c.FailWithMessage("用印添加失败", err.Error())
@@ -78,23 +89,37 @@ func (c *SealCommon) Edit() {
 		return
 	}
 
-	//参数校验
-	paramVerify := utils.Rules{
-		"SealId":      {utils.NotEmpty()},
-		"Use":         {utils.NotEmpty()},
-		"CompanyName": {utils.NotEmpty()},
-		"CreditCode":  {utils.NotEmpty()},
-		"ServiceType": {utils.NotEmpty()},
-		"SealType":    {utils.NotEmpty()},
-		"FileUrl":     {utils.NotEmpty()},
-	}
-	err = utils.Verify(req, paramVerify, utils.LANG_CN)
-
+	// 参数校验
 	if req.SealId <= 0 {
-		c.FailWithMessage("合同编号必传!", "合同编号必传!")
+		c.FailWithMessage("用印编号不能为空", "用印编号不能为空")
+		return
+	}
+	if req.Use == "" {
+		c.FailWithMessage("用印用途不能为空", "用印用途不能为空")
+		return
+	}
+	if req.CompanyName == "" {
+		c.FailWithMessage("客户名称不能为空", "客户名称不能为空")
 		return
 	}
-	sealInfo, err := sealService.Edit(req.SealId, c.AdminWx.AdminId, req.ContractId, req.FileNum, req.Use, req.CompanyName, req.UseCompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrl)
+	if req.CreditCode == "" {
+		c.FailWithMessage("社会统一信用代码不能为空", "社会统一信用代码不能为空")
+		return
+	}
+	if req.ServiceType == "" {
+		c.FailWithMessage("合同类型不能为空", "合同类型不能为空")
+		return
+	}
+	if req.SealType == "" {
+		c.FailWithMessage("印章类型不能为空", "印章类型不能为空")
+		return
+	}
+	if req.FileUrl == "" {
+		c.FailWithMessage("合同附件不能为空", "合同附件不能为空")
+		return
+	}
+
+	sealInfo, err := sealService.Edit(req.SealId, c.AdminWx.AdminId, req.ContractId, req.FileNum, req.Use, req.CompanyName, req.UseCompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrl, c.AdminWx.RealName)
 	if err != nil {
 		c.FailWithMessage("修改合同失败!", "修改合同失败,Err:"+err.Error())
 		return
@@ -123,21 +148,22 @@ func (c *SealCommon) CheckEdit() {
 		return
 	}
 
-	//参数校验
-	paramVerify := utils.Rules{
-		"SealId":      {utils.NotEmpty()},
-		"Use":         {utils.NotEmpty()},
-		"CompanyName": {utils.NotEmpty()},
-		"CreditCode":  {utils.NotEmpty()},
-		"ServiceType": {utils.NotEmpty()},
-		"SealType":    {utils.NotEmpty()},
-		"FileUrl":     {utils.NotEmpty()},
-	}
-	err = utils.Verify(req, paramVerify, utils.LANG_CN)
-
+	// 参数校验
 	sealId := req.SealId
 	if sealId <= 0 {
-		c.FailWithMessage("请传入用印单编号!", "请传入用印单编号!")
+		c.FailWithMessage("用印编号不能为空", "用印编号不能为空")
+		return
+	}
+	if req.Use == "" {
+		c.FailWithMessage("用印用途不能为空", "用印用途不能为空")
+		return
+	}
+	if req.SealType == "" {
+		c.FailWithMessage("印章类型不能为空", "印章类型不能为空")
+		return
+	}
+	if req.FileUrl == "" {
+		c.FailWithMessage("合同附件不能为空", "合同附件不能为空")
 		return
 	}
 

+ 7 - 2
controllers/seal_approval.go

@@ -367,6 +367,11 @@ func (c *SealApprovalCommon) Reject() {
 		c.FailWithMessage("请传入用印单编号!", "请传入用印单编号!")
 		return
 	}
+	remark := strings.Trim(req.Remark, " ")
+	if remark == "" {
+		c.FailWithMessage("请输入驳回理由!", "请输入驳回理由!")
+		return
+	}
 
 	//数据校验
 	sealInfo, approvalInfo, approvalRecord, err := sealService.CheckApproveAuth(sealId, c.AdminWx)
@@ -374,7 +379,7 @@ func (c *SealApprovalCommon) Reject() {
 		c.FailWithMessage("驳回审批失败!", "驳回审批失败,Err:"+err.Error())
 		return
 	}
-	err = sealService.Reject(sealInfo, approvalInfo, approvalRecord, c.AdminWx, req.Remark)
+	err = sealService.Reject(sealInfo, approvalInfo, approvalRecord, c.AdminWx, remark)
 	if err != nil {
 		c.FailWithMessage("驳回审批失败!", "驳回审批失败,Err:"+err.Error())
 		return
@@ -436,7 +441,7 @@ func (c *SealApprovalCommon) CancelApply() {
 		c.FailWithMessage("获取审批流信息失败", "获取审批流信息失败,err:"+err.Error())
 		return
 	}
-	err = sealService.CancelApply(sealInfo, c.AdminWx.AdminId)
+	err = sealService.CancelApply(sealInfo, c.AdminWx.AdminId, c.AdminWx.RealName)
 	if err != nil {
 		c.FailWithMessage("撤回申请失败!", "撤回申请失败,Err:"+err.Error())
 		return

+ 1 - 0
models/db_init.go

@@ -81,6 +81,7 @@ func init() {
 		new(wx_token.WxToken),
 		new(wx_user.WxUser),
 		new(seal.Seal), //用印表
+		new(seal.SealOperationRecord),	// 用印操作记录表
 	)
 
 }

+ 3 - 0
models/tables/seal/seal.go

@@ -34,6 +34,9 @@ type Seal struct {
 	CheckBackFileTime time.Time `description:"签回用印附件时间"`
 }
 
+var EnumUse = []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议", "代付合同", "总对总协议"}
+var EnumServiceType = []string{"新签合同", "续约合同", "补充协议", "代付合同"}
+
 //GetSealInfoById 根据用印id获取合同信息
 func GetSealInfoById(sealId int) (sealInfo *Seal, err error) {
 	o := orm.NewOrm()

+ 48 - 0
models/tables/seal/seal_operation_record.go

@@ -0,0 +1,48 @@
+package seal
+
+import (
+	"github.com/rdlucklib/rdluck_tools/orm"
+	"time"
+)
+
+type SealOperationRecord struct {
+	Id               int       `orm:"column(id);pk"`
+	SealId           int       `orm:"column(seal_id)";description:"用印ID"`
+	Operation        string    `description:"操作类型,add:新增,edit:编辑,apply:发起审批,cancel:撤回审批,reject:拒绝审批,approval:审批操作,invalid:作废;长度36位"`
+	OpUserId         int       `description:"操作人id"`
+	OpUserName       string    `description:"操作人名称"`
+	Remark           string    `description:"备注,长度255位"`
+	ApprovalRecordId int       `orm:"column(approval_record_id)";description:"审批流id"`
+	ApprovalRemark   string    `description:"审批备注"`
+	CreateTime       time.Time `description:"日志添加时间"`
+}
+
+type SealOperationRecordList struct {
+	SealOperationRecord
+	CreateTimeStr string `description:"日志添加时间标准格式"`
+}
+
+// GetSealOperationListBySealId 根据用印ID获取所有操作日志
+func GetSealOperationListBySealId(sealId int) (list []*SealOperationRecordList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM seal_operation_record WHERE seal_id = ? ORDER BY id DESC`
+	_, err = o.Raw(sql, sealId).QueryRows(&list)
+	return
+}
+
+// AddContractOperationRecord 添加用印操作日志
+func AddSealOperationRecord(sealId, opUserId, approvalRecordId int, operation, opUserName, remark, approvalRemark string) (err error) {
+	o := orm.NewOrm()
+	item := &SealOperationRecord{
+		SealId:           sealId,
+		Operation:        operation,
+		OpUserId:         opUserId,
+		OpUserName:       opUserName,
+		Remark:           remark,
+		ApprovalRecordId: approvalRecordId,
+		ApprovalRemark:   approvalRemark,
+		CreateTime:       time.Now(),
+	}
+	_, err = o.Insert(item)
+	return
+}

+ 36 - 7
services/seal/approval.go

@@ -40,6 +40,20 @@ func Apply(sealInfo *seal.Seal) (err error) {
 	return
 }
 
+// GetFlowTypeBySealType 根据盖章类型(多选,逗号拼接)获取审批流的类型
+func GetFlowTypeBySealType(sealType string) (flowType int) {
+	flowType = 5	// 合同章
+	longFlow := "公章,法人章"	// 盖章类型包含其中之一则审批流变成6
+	sealTypeArr := strings.Split(sealType, ",")
+	for _, itemType := range sealTypeArr {
+		if strings.Contains(longFlow, itemType) {
+			flowType = 6
+		}
+	}
+
+	return
+}
+
 //审批人修改后重新提交审批单
 func CheckApply(sealInfo *seal.Seal, opUser *custom.AdminWx) (err error) {
 	//发起审批
@@ -95,12 +109,8 @@ func apply(sealInfo *seal.Seal) (approval *contract_approval.ContractApproval, c
 		return
 	}
 
-	//获取基础审批流
-	flowId := 5
-	//如果是法人章或者是公章
-	if sealInfo.SealType == "法人章" || sealInfo.SealType == "公章" {
-		flowId = 6
-	}
+	//获取审批流
+	flowId := GetFlowTypeBySealType(sealInfo.SealType)
 	flowItemInfo, err := flow.GetApprovalFlow(flowId)
 	if err != nil {
 		return
@@ -170,7 +180,7 @@ func apply(sealInfo *seal.Seal) (approval *contract_approval.ContractApproval, c
 }
 
 //撤销合同
-func CancelApply(sealInfo *seal.Seal, opUserId int) (err error) {
+func CancelApply(sealInfo *seal.Seal, opUserId int, opUserName string) (err error) {
 	if sealInfo == nil {
 		err = errors.New("审批流异常,没有审批流信息")
 		return
@@ -226,6 +236,12 @@ func CancelApply(sealInfo *seal.Seal, opUserId int) (err error) {
 	if err != nil {
 		return
 	}
+	// 操作日志
+	err = seal.AddSealOperationRecord(sealInfo.SealId, opUserId, 0, "cancel", opUserName, "撤回用印申请", "")
+	if err != nil {
+		err = errors.New("新增用印日志失败")
+		return
+	}
 
 	////添加操作日志
 	//remark := "撤回申请"
@@ -362,6 +378,13 @@ func reject(sealInfo *seal.Seal, approvalInfo *contract_approval.ContractApprova
 	if err != nil {
 		return
 	}
+	// 操作日志
+	err = seal.AddSealOperationRecord(sealInfo.SealId, opUser.AdminId, approvalRecord.ContractApprovalRecordId, "reject", opUser.RealName, "驳回审批", rejectRemark)
+	if err != nil {
+		err = errors.New("新增用印日志失败")
+		return
+	}
+
 	return
 }
 
@@ -413,6 +436,12 @@ func Approved(sealInfo *seal.Seal, approvalInfo *contract_approval.ContractAppro
 	if err != nil {
 		return
 	}
+	// 操作日志
+	err = seal.AddSealOperationRecord(sealInfo.SealId, opUser.AdminId, approvalRecord.ContractApprovalRecordId, "approved", opUser.RealName, "通过审批", "")
+	if err != nil {
+		err = errors.New("新增用印日志失败")
+		return
+	}
 
 	//添加操作日志
 	//remark := "审批通过"

+ 46 - 28
services/seal/seal.go

@@ -20,21 +20,14 @@ import (
 
 // AddSeal 添加用印
 func AddSeal(userId, contractId, fileNum int, userName, use, useCompanyName, companyName, creditCode, serviceType, sealType, remark, fileUrl string) (sealInfo *seal.Seal, err error) {
-	useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
-	serviceTypeList := []string{"新签合同", "续约合同", "补充协议"}
-	sealTypeList := []string{"合同章", "公章", "法人章"}
-	if !strings.Contains(strings.Join(useList, ","), use) {
+	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
 	}
-	if !strings.Contains(strings.Join(serviceTypeList, ","), serviceType) {
+	if !strings.Contains(strings.Join(seal.EnumServiceType, ","), serviceType) {
 		err = errors.New("业务类型异常")
 		return
 	}
-	if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
-		err = errors.New("加盖印章类型异常")
-		return
-	}
 
 	sealCode, err := seal.GetSealCode()
 	if err != nil {
@@ -59,26 +52,31 @@ func AddSeal(userId, contractId, fileNum int, userName, use, useCompanyName, com
 		CreateTime:     time.Now(),
 	}
 	err = seal.AddSeal(sealInfo)
+	if err != nil {
+		err = errors.New("新增用印失败")
+		return
+	}
+
+	// 操作日志
+	err = seal.AddSealOperationRecord(sealInfo.SealId, userId, 0, "apply", userName, "提交审批", "")
+	if err != nil {
+		err = errors.New("新增用印日志失败")
+		return
+	}
+
 	return
 }
 
 // Edit 修改用印
-func Edit(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark, fileUrl string) (sealInfo *seal.Seal, err error) {
-	useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
-	serviceTypeList := []string{"新签合同", "续约合同", "补充协议"}
-	sealTypeList := []string{"合同章", "公章", "法人章"}
-	if !strings.Contains(strings.Join(useList, ","), use) {
+func Edit(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark, fileUrl, userName string) (sealInfo *seal.Seal, err error) {
+	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
 	}
-	if !strings.Contains(strings.Join(serviceTypeList, ","), serviceType) {
+	if !strings.Contains(strings.Join(seal.EnumServiceType, ","), serviceType) {
 		err = errors.New("业务类型异常")
 		return
 	}
-	if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
-		err = errors.New("加盖印章类型异常")
-		return
-	}
 
 	//查询当前合同信息
 	sealInfo, err = seal.GetSealInfoById(sealId)
@@ -108,26 +106,32 @@ func Edit(sealId, userId, contractId, fileNum int, use, companyName, userCompany
 	sealInfo.FileUrl = fileUrl
 	sealInfo.FileNum = fileNum
 	sealInfo.ContractId = contractId
+	sealInfo.CreateTime = time.Now()	// 重提更新提交时间
 	sealInfo.ModifyTime = time.Now()
 	sealInfo.Status = "待提交" //用印状态
 
-	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "ModifyTime", "Status"})
+	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "FileNum", "ContractId", "CreateTime", "ModifyTime", "Status"})
+	if err != nil {
+		err = errors.New("新增用印日志失败")
+		return
+	}
+
+	// 操作日志
+	err = seal.AddSealOperationRecord(sealInfo.SealId, userId, 0, "edit", userName, "重提审批", "")
+	if err != nil {
+		err = errors.New("编辑用印日志失败")
+		return
+	}
 
 	return
 }
 
 // CheckEdit 审批者修改用印
 func CheckEdit(sealInfo *seal.Seal, approvalInfo *contract_approval.ContractApproval, approvalRecord *contract_approval_record.ContractApprovalRecord, fileNum int, fileUrl, use, sealType, remark string, opUser *custom.AdminWx) (err error) {
-	useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
-	sealTypeList := []string{"合同章", "公章", "法人章"}
-	if !strings.Contains(strings.Join(useList, ","), use) {
+	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
 	}
-	if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
-		err = errors.New("加盖印章类型异常")
-		return
-	}
 
 	//判断是否是合规账号
 	if opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
@@ -172,10 +176,14 @@ func CheckEdit(sealInfo *seal.Seal, approvalInfo *contract_approval.ContractAppr
 	}
 	content := "用印修改:" + opUser.RealName + "修改了" + strings.Join(updateContent, "、")
 
+	// 通过盖章类型判断是否需要变更审批流程
+	originFlowType := GetFlowTypeBySealType(sealInfo.SealType)
+	reqFlowType := GetFlowTypeBySealType(sealType)
+
 	//如果变更了盖章类型(涉及到审批流程变更),那么需要变更审批流
 	//变更审批流:先驳回用印申请,再修改用印,再发消息给申请人,再替申请人重新发起申请,
 	//然后遍历审批流程,当前操作人节点之前的全部审核通过,最后通过当前操作人的节点(改成如果一级审批人如果是自己,那么直接通过这一级审批,否则不通过,让审批单重走流程)
-	if (sealInfo.SealType == "合同章" && strings.Contains("公章,法人章", sealType)) || (strings.Contains("公章,法人章", sealInfo.SealType) && sealType == "合同章") {
+	if originFlowType != reqFlowType {
 		//先驳回
 		err = CheckReject(sealInfo, approvalInfo, approvalRecord, opUser, "")
 		if err != nil {
@@ -225,6 +233,9 @@ func CheckEdit(sealInfo *seal.Seal, approvalInfo *contract_approval.ContractAppr
 func checkEdit(sealInfo *seal.Seal, updateCol []string, approvalRecordId int, content string, opUser *custom.AdminWx) {
 	_ = sealInfo.Update(updateCol)
 
+	// 操作日志
+	_ = seal.AddSealOperationRecord(sealInfo.SealId, opUser.AdminId, approvalRecordId, "edit", opUser.RealName, "审批人修改信息", "")
+
 	//给用印人,发送修改消息
 	sysUserMobile := ""
 	sysUser, _ := admin.GetAdminById(opUser.AdminId)
@@ -266,6 +277,13 @@ func Invalid(sealId int, opUser *custom.AdminWx, isInvalidContract bool) (err er
 		return
 	}
 
+	// 操作日志
+	err = seal.AddSealOperationRecord(sealInfo.SealId, opUser.AdminId, 0, "invalid", opUser.RealName, "作废审批", "")
+	if err != nil {
+		err = errors.New("新增用印日志失败")
+		return
+	}
+
 	//如果是系统合同,同时需要同步作废合同时,那么逻辑处理
 	if sealInfo.ContractId > 0 && isInvalidContract {
 		err = contractService.InvalidContract(sealInfo.ContractId, opUser)