Browse Source

2023-12-28 报销管理审批金额、审批意见

zoie 11 months ago
parent
commit
87d7e3fe0a
7 changed files with 107 additions and 57 deletions
  1. 1 1
      conf/app.conf
  2. 47 20
      controllers/Reimburse.go
  3. 1 1
      main.go
  4. 22 16
      models/Reimburse/Reimburse.go
  5. 33 16
      models/Reimburse/ReimburseDetails.go
  6. 2 2
      routers/filter.go
  7. 1 1
      routers/router.go

+ 1 - 1
conf/app.conf

@@ -7,7 +7,7 @@ copyrequestbody = true
 
 Sys_Name = "ERP_SALARY"
 # Nats
-NatsServer_Url = "127.0.0.1:4222"
+NatsServer_Url = "127.0.0.1:4223"
 NatsSubj_Prefix = "Test_"
 # Mysql 线上
 MysqlServer_UrlPort = "127.0.0.1:3316"

+ 47 - 20
controllers/Reimburse.go

@@ -12,6 +12,9 @@ import (
 	userlibs "git.baozhida.cn/ERP_libs/User"
 	"git.baozhida.cn/ERP_libs/lib"
 	"github.com/beego/beego/v2/adapter/orm"
+	"strconv"
+	"strings"
+
 	//"github.com/beego/beego/v2/client/orm"
 	beego "github.com/beego/beego/v2/server/web"
 	"math"
@@ -233,8 +236,9 @@ func (c *ReimburseController) Reimburse_Add() {
 	data := c.Ctx.Input.RequestBody
 	err := json.Unmarshal(data, &body)
 	if err != nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "json.Unmarshal is err:" + err.Error()}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "json 反序列化错误:" + err.Error()}
 		c.ServeJSON()
+		return
 	}
 
 	if len(body.ReimburseDetails) == 0 {
@@ -318,6 +322,7 @@ func (c *ReimburseController) Reimburse_Edit() {
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "json.Unmarshal is err:" + err.Error()}
 		c.ServeJSON()
+		return
 	}
 
 	user_r, err := NatsServer.Verification(body.User_tokey, "")
@@ -579,59 +584,81 @@ func (c *ReimburseController) Reimburse_Edit_Audit() {
 	return
 }
 
-// 修改打款明细
-func (c *ReimburseController) Reimburse_Edit_Remit() {
+// 修改(财务)
+func (c *ReimburseController) Reimburse_Edit_Finance() {
 
 	T_id, _ := c.GetInt("T_id")
-	T_remit_detials := c.GetString("T_remit_detials")
+	T_approval_money, _ := c.GetFloat("T_approval_money")
+	T_approval_details := c.GetString("T_approval_details")
+	T_remit_details := c.GetString("T_remit_detials")
 
 	o := orm.NewOrm()
+	o.Begin()
 	ReimburseDao := Reimburse.NewReimburse(o)
-
+	ReimburseDetailsDao := Reimburse.NewReimburseDetails(o)
 	reimburse, err := ReimburseDao.Read_Reimburse_ById(T_id)
 	if err != nil {
+		o.Rollback()
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
 		c.ServeJSON()
 		return
 	}
 
 	// 1 未提交审核 2 待审核 3 审核通过 4 审核不通过 5 已部分打款 6 已全部打款
-	if reimburse.T_State != Reimburse.AuditPass && reimburse.T_State != Reimburse.RemitPart && reimburse.T_State != Reimburse.RemitAll {
+	if reimburse.T_State == Reimburse.WaitSubmit {
+		o.Rollback()
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("状态为%s,禁止修改!", Reimburse.Read_Audit_Get(reimburse.T_State))}
 		c.ServeJSON()
 		return
 	}
 
-	remitList := Reimburse.ReimburseToRemitDetail(T_remit_detials)
+	approval_details_list := strings.Split(strings.Trim(T_approval_details, "|"), "|")
+	for _, detail := range approval_details_list {
+		id, _ := strconv.Atoi(strings.Split(detail, ",")[0])
+		money := lib.StringToFloat64TwoDecimal(strings.Split(detail, ",")[1]) // 审批金额
+		opinion := strings.Split(detail, ",")[2]                              // 审批意见
+		err = ReimburseDetailsDao.Update_ReimburseDetails(Reimburse.ReimburseDetails{
+			Id:                 id,
+			T_approval_money:   float32(money),
+			T_approval_opinion: opinion,
+		}, "T_approval_money", "T_approval_opinion")
+		if err != nil {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改报销详情失败!"}
+			c.ServeJSON()
+			return
+		}
+
+	}
+
 	var T_remit float32
+	remitList := Reimburse.ReimburseToRemitDetail(T_remit_details)
 	for _, r := range remitList {
 		T_remit += r.T_money
 	}
 
-	if T_remit == 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "打款金额不正确!"}
-		c.ServeJSON()
-		return
-	}
-
-	if T_remit == reimburse.T_money {
+	if T_remit == reimburse.T_approval_money && T_remit > 0 {
 		reimburse.T_State = Reimburse.RemitAll
-	} else if T_remit < reimburse.T_money && T_remit > 0 {
+	} else if T_remit < reimburse.T_approval_money && T_remit > 0 {
 		reimburse.T_State = Reimburse.RemitPart
 	}
 
 	reimburse.T_remit = T_remit
-	reimburse.T_remit_detials = T_remit_detials
-	_, err = ReimburseDao.Update_Reimburse(reimburse, "T_State", "T_remit", "T_remit_detials")
+	reimburse.T_approval_money = float32(T_approval_money)
+	reimburse.T_remit_detials = T_remit_details
+	_, err = ReimburseDao.Update_Reimburse(reimburse, "T_State", "T_remit", "T_remit_detials", "T_approval_money")
 	if err != nil {
+		o.Rollback()
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改审核状态失败!"}
 		c.ServeJSON()
 		return
 	}
+	o.Commit()
+	if T_remit > 0 {
+		NatsServer.AddNews(reimburse.T_uid, fmt.Sprintf("【报销打款】您的报销申请已%s", Reimburse.Read_Audit_Get(reimburse.T_State)), conf.MyReimburseUrl)
+	}
 
-	NatsServer.AddNews(reimburse.T_uid, fmt.Sprintf("【报销打款】您的报销申请已%s", Reimburse.Read_Audit_Get(reimburse.T_State)), conf.MyReimburseUrl)
-
-	NatsServer.AddUserLogs(c.User.T_uuid, "报销", "修改打款明细", err)
+	NatsServer.AddUserLogs(c.User.T_uuid, "报销", "修改(财务)", err)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
 	c.ServeJSON()

+ 1 - 1
main.go

@@ -38,7 +38,7 @@ func main() {
 		// 可选参数"GET", "POST", "PUT", "DELETE", "OPTIONS" (*为所有)
 		AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
 		// 指的是允许的Header的种类
-		AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type", "User_tokey"},
+		AllowHeaders: []string{"X-Custom-Header", "accept", "Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type", "User_tokey"},
 		// 公开的HTTP标头列表
 		ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
 		// 如果设置,则允许共享身份验证凭据,例如cookie

+ 22 - 16
models/Reimburse/Reimburse.go

@@ -45,15 +45,16 @@ func Read_Audit_Get(Id int) string {
 
 // 报销
 type Reimburse struct {
-	Id              int       `orm:"column(ID);size(11);auto;pk"`
-	T_uid           string    `orm:"index;size(64);null"`                                   // 用户uuid
-	T_date          string    `orm:"size(64);null"`                                         // 提交日期,2023-08-11
-	T_money         float32   `orm:"digits(12);decimals(2)"`                                // 报销总金额
-	T_remit         float32   `orm:"digits(12);decimals(2)"`                                // 打款金额
-	T_State         int       `orm:"size(20);default(1)"`                                   // 0 删除 1 未提交审核 2 待审核 3 审核通过 4 审核不通过 5 已部分打款 6 已全部打款
-	T_remit_detials string    `orm:"digits(1024);decimals(2)"`                              // 打款明细 日期,打款金额|日期,打款金额|
-	CreateTime      time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
-	UpdateTime      time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
+	Id               int       `orm:"column(ID);size(11);auto;pk"`
+	T_uid            string    `orm:"index;size(64);null"`                                   // 用户uuid
+	T_date           string    `orm:"size(64);null"`                                         // 提交日期,2023-08-11
+	T_money          float32   `orm:"digits(12);decimals(2)"`                                // 报销总金额
+	T_remit          float32   `orm:"digits(12);decimals(2)"`                                // 打款金额
+	T_State          int       `orm:"size(20);default(1)"`                                   // 0 删除 1 未提交审核 2 待审核 3 审核通过 4 审核不通过 5 已部分打款 6 已全部打款
+	T_remit_detials  string    `orm:"size(1024)"`                                            // 打款明细 日期,打款金额|日期,打款金额|
+	T_approval_money float32   `orm:"digits(12);decimals(2)"`                                // 审批金额
+	CreateTime       time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+	UpdateTime       time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
 func (t *Reimburse) TableName() string {
@@ -74,13 +75,14 @@ func init() {
 }
 
 type Reimburse_R struct {
-	Id          int
-	T_uid       string  // 用户uuid
-	T_user_name string  // 用户名称
-	T_date      string  // 提交日期,2023-08-11
-	T_money     float32 // 报销总金额
-	T_remit     float32 // 打款金额
-	T_State     int     // 0 删除 1 未提交审核 2 待审核 3 审核通过 4 审核不通过 5 已部分打款 6 已全部打款
+	Id               int
+	T_uid            string  // 用户uuid
+	T_user_name      string  // 用户名称
+	T_date           string  // 提交日期,2023-08-11
+	T_money          float32 // 报销总金额
+	T_remit          float32 // 打款金额
+	T_approval_money float32 // 审批金额
+	T_State          int     // 0 删除 1 未提交审核 2 待审核 3 审核通过 4 审核不通过 5 已部分打款 6 已全部打款
 
 }
 
@@ -96,6 +98,8 @@ type Reimburse_Detail struct {
 	T_money             float32              // 报销总金额
 	T_remit             float32              // 打款金额
 	T_State             int                  // 0 删除 1 未提交审核 2 待审核 3 审核通过 4 审核不通过 5 已部分打款 6 已全部打款
+	T_approval_money    float32              // 审批金额
+	T_approval_opinion  string               // 审批意见
 	T_reimburse_details []ReimburseDetails_R // 报销明细
 	T_remit_detail      []RemitDetail_R      // 打款明细
 }
@@ -110,6 +114,7 @@ func ReimburseToReimburse_R(t Reimburse) (r Reimburse_R) {
 	r.T_money = t.T_money
 	r.T_remit = t.T_remit
 	r.T_State = t.T_State
+	r.T_approval_money = t.T_approval_money
 	return r
 }
 func ReimburseToReimburse_Detail(t Reimburse, T_reimburse_details []ReimburseDetails_R) (r Reimburse_Detail) {
@@ -121,6 +126,7 @@ func ReimburseToReimburse_Detail(t Reimburse, T_reimburse_details []ReimburseDet
 	r.T_money = t.T_money
 	r.T_remit = t.T_remit
 	r.T_State = t.T_State
+	r.T_approval_money = t.T_approval_money
 	r.T_reimburse_details = T_reimburse_details
 	r.T_remit_detail = ReimburseToRemitDetail(t.T_remit_detials)
 	return r

+ 33 - 16
models/Reimburse/ReimburseDetails.go

@@ -12,21 +12,23 @@ import (
 
 // 报销明细
 type ReimburseDetails struct {
-	Id                int       `orm:"column(ID);size(11);auto;pk"`
-	T_reimburse_id    int       `orm:"index;size(64);null"`                                   // 报销id
-	T_trip_start_time string    `orm:"size(64);null"`                                         // 出差开始时间
-	T_trip_end_time   string    `orm:"size(64);null"`                                         // 出差结束时间
-	T_trip_origin     string    `orm:"size(128);null"`                                        // 出差起点
-	T_trip_terminus   string    `orm:"size(128);null"`                                        // 出差起点
-	T_fee_type        int       `orm:"size(11);null"`                                         // 费用类型
-	T_fee_details     int       `orm:"size(11);null"`                                         // 费用明细
-	T_money           float32   `orm:"digits(12);decimals(2)"`                                // 费用金额
-	T_reasons         string    `orm:"size(1024);null"`                                       // 费用事由
-	T_project         string    `orm:"size(1024);null"`                                       // 涉及项目
-	T_img             string    `orm:"size(1024);null"`                                       // 图片链接
-	T_State           int       `orm:"size(20);default(1)"`                                   // 0 删除 1 正常
-	CreateTime        time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
-	UpdateTime        time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
+	Id                 int       `orm:"column(ID);size(11);auto;pk"`
+	T_reimburse_id     int       `orm:"index;size(64);null"`                                   // 报销id
+	T_trip_start_time  string    `orm:"size(64);null"`                                         // 出差开始时间
+	T_trip_end_time    string    `orm:"size(64);null"`                                         // 出差结束时间
+	T_trip_origin      string    `orm:"size(128);null"`                                        // 出差起点
+	T_trip_terminus    string    `orm:"size(128);null"`                                        // 出差起点
+	T_fee_type         int       `orm:"size(11);null"`                                         // 费用类型
+	T_fee_details      int       `orm:"size(11);null"`                                         // 费用明细
+	T_money            float32   `orm:"digits(12);decimals(2)"`                                // 费用金额
+	T_reasons          string    `orm:"size(1024);null"`                                       // 费用事由
+	T_project          string    `orm:"size(1024);null"`                                       // 涉及项目
+	T_img              string    `orm:"size(1024);null"`                                       // 图片链接
+	T_State            int       `orm:"size(20);default(1)"`                                   // 0 删除 1 正常
+	T_approval_money   float32   `orm:"digits(12);decimals(2)"`                                // 审批金额
+	T_approval_opinion string    `orm:"size(1024);null"`                                       // 审批意见
+	CreateTime         time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+	UpdateTime         time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
 func (t *ReimburseDetails) TableName() string {
@@ -53,11 +55,13 @@ type ReimburseDetails_R struct {
 	T_project          string  // 涉及项目
 	T_img              string  // 图片链接
 	T_State            int     // 0 删除 1 正常
-
+	T_approval_money   float32 // 审批总金额
+	T_approval_opinion string  // 审批意见
 }
 
 // ---------------- 特殊方法 -------------------
 func ReimburseDetailsToReimburseDetails_R(t ReimburseDetails) (r ReimburseDetails_R) {
+	r.Id = t.Id
 	r.T_reimburse_id = t.T_reimburse_id
 	r.T_trip_start_time = t.T_trip_start_time
 	r.T_trip_end_time = t.T_trip_end_time
@@ -72,6 +76,8 @@ func ReimburseDetailsToReimburseDetails_R(t ReimburseDetails) (r ReimburseDetail
 	r.T_project = t.T_project
 	r.T_img = t.T_img
 	r.T_State = t.T_State
+	r.T_approval_money = t.T_approval_money
+	r.T_approval_opinion = t.T_approval_opinion
 	return r
 }
 
@@ -102,6 +108,17 @@ func (dao *ReimburseDetailsDaoImpl) Read_ReimburseDetailsList_ByT_reimburse_id(T
 	return
 }
 
+// 获取 ById
+func (dao *ReimburseDetailsDaoImpl) Read_ReimburseDetailsById(id int) (r ReimburseDetails, err error) {
+	qs := dao.orm.QueryTable(new(ReimburseDetails))
+
+	err = qs.Filter("id", id).One(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+}
+
 // 修改
 func (dao *ReimburseDetailsDaoImpl) Update_ReimburseDetails(m ReimburseDetails, cols ...string) error {
 	_, err := dao.orm.Update(&m, cols...)

+ 2 - 2
routers/filter.go

@@ -59,13 +59,13 @@ func RBACFilter(ctx *context.Context) {
 	}
 	o := orm.NewOrm()
 	powerDao := powerlibs.NewPower(o)
+
 	power, err := powerDao.Read_Power_ByT_id(user_r.T_power)
 	if err != nil {
-		data := lib.JSONS{Code: 202, Msg: "无权访问!"}
+		data := lib.JSONS{Code: 202, Msg: "获取权限失败!"}
 		ctx.Output.JSON(data, true, false)
 		return
 	}
-
 	if power.T_menu == "*" {
 		return
 	}

+ 1 - 1
routers/router.go

@@ -37,7 +37,7 @@ func init() {
 		beego.NSRouter("/Get", &controllers.ReimburseController{}, "*:Reimburse_Get"),                   // 报销详情
 		beego.NSRouter("/Submit_Audit", &controllers.ReimburseController{}, "*:Reimburse_Submit_Audit"), // 提交审核
 		beego.NSRouter("/Edit_Audit", &controllers.ReimburseController{}, "*:Reimburse_Edit_Audit"),     // 修改审核状态
-		beego.NSRouter("/Edit_Remit", &controllers.ReimburseController{}, "*:Reimburse_Edit_Remit"),     // 修改打款明细
+		beego.NSRouter("/Edit_Finance", &controllers.ReimburseController{}, "*:Reimburse_Edit_Finance"), // 修改(财务)
 	)
 
 	beego.AddNamespace(ns, ns2)