Procházet zdrojové kódy

add:采购管理

zoie před 1 měsícem
rodič
revize
86c4920a16

+ 2 - 0
conf/app.conf

@@ -40,6 +40,8 @@ ContractApprovalUrl = "/contract"
 VerifyContractUrl = "/contract"
 PercentageApprovalUrl = "/percentage"
 ContractReviewAuditUrl = "/contractReviewList"
+PurchaseAuditUrl = "/purchase"
+MyPurchaseNewsUrl = "/myPurchase"
 # 财务uuid
 FinanceUuid = "NeGSMvREXA8xDZWo6q1YjLHTm0dJg7zc"
 

+ 2 - 0
conf/config.go

@@ -45,6 +45,8 @@ var VerifyContractUrl, _ = beego.AppConfig.String("VerifyContractUrl")
 var PercentageApprovalUrl, _ = beego.AppConfig.String("PercentageApprovalUrl")
 var MyPercentageUrl, _ = beego.AppConfig.String("MyPercentageUrl")
 var ContractReviewAuditUrl, _ = beego.AppConfig.String("ContractReviewAuditUrl")
+var PurchaseAuditUrl, _ = beego.AppConfig.String("PurchaseAuditUrl")
+var MyPurchaseNewsUrl, _ = beego.AppConfig.String("MyPurchaseNewsUrl")
 
 var FinanceUuid, _ = beego.AppConfig.String("FinanceUuid")
 

+ 2 - 2
controllers/IOTNetworkCard.go

@@ -108,7 +108,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Add() {
 	recordB, _ := json.Marshal(&record)
 	var_.T_record = string(recordB)
 
-	card, err := IOTNetworkCard.Read_IOTNetworkCard_ByT_MSISDN(T_MSISDN)
+	card, err := IOTNetworkCard.Read_IOTNetworkCard_ByT_iccid(T_iccid)
 	if err != nil && err.Error() != orm.ErrNoRows.Error() {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败"}
 		c.ServeJSON()
@@ -301,7 +301,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 					return
 				}
 				T_MSISDN := row[6]
-				//_, errGet := IOTNetworkCard.Read_IOTNetworkCard_ByT_MSISDN(T_MSISDN)
+				//_, errGet := IOTNetworkCard.Read_IOTNetworkCard_ByT_iccid(T_MSISDN)
 				//if errGet != nil && errGet.Error() != orm.ErrNoRows.Error() {
 				//	continue
 				//}

+ 285 - 0
controllers/Purchase.go

@@ -0,0 +1,285 @@
+package controllers
+
+import (
+	"ERP_storage/Nats/NatsServer"
+	"ERP_storage/conf"
+	"ERP_storage/models/Account"
+	"ERP_storage/models/Purchase"
+	"fmt"
+	"github.com/beego/beego/v2/adapter/orm"
+	beego "github.com/beego/beego/v2/server/web"
+	userlibs "gogs.baozhida.cn/zoie/ERP_libs/User"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
+	"math"
+)
+
+type PurchaseController struct {
+	beego.Controller
+	User userlibs.User
+}
+
+func (c *PurchaseController) Prepare() {
+	c.User = *Account.User_r
+}
+
+// 部门负责人查看的权限列表
+func (c *PurchaseController) Purchase_List() {
+
+	// 分页参数 初始化
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	T_uuid := c.GetString("T_uuid")
+
+	T_start_date := c.GetString("T_start_date") // 开始时间
+	T_end_date := c.GetString("T_end_date")     // 结束时间
+
+	T_state, _ := c.GetInt("T_state")
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+
+	PurchaseDao := Purchase.NewPurchase(orm.NewOrm())
+	R_List, R_cnt := PurchaseDao.Read_Purchase_List(T_uuid, "", T_state, T_start_date, T_end_date, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+// 用户采购列表
+func (c *PurchaseController) Purchase_User_List() {
+
+	// 分页参数 初始化
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+	T_start_date := c.GetString("T_start_date") // 开始时间
+	T_end_date := c.GetString("T_end_date")     // 结束时间
+
+	T_state, _ := c.GetInt("T_state")
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+
+	PurchaseDao := Purchase.NewPurchase(orm.NewOrm())
+	R_List, R_cnt := PurchaseDao.Read_Purchase_List(c.User.T_uuid, "", T_state, T_start_date, T_end_date, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *PurchaseController) Purchase_Get() {
+
+	// 查询
+	T_id, _ := c.GetInt("T_id")
+
+	o := orm.NewOrm()
+	PurchaseDao := Purchase.NewPurchase(o)
+	purchase, err := PurchaseDao.Read_Purchase_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Purchase.PurchaseToPurchase_Detail(purchase)}
+	c.ServeJSON()
+	return
+}
+
+func (c *PurchaseController) Purchase_Add() {
+
+	T_uuid := c.GetString("T_uuid")
+	T_date := c.GetString("T_date")
+	T_remark := c.GetString("T_remark")
+	T_detail := c.GetString("T_detail")
+	T_approver := c.GetString("T_approver")
+
+	var_ := Purchase.Purchase{
+		T_uuid:     T_uuid,
+		T_submit:   c.User.T_uuid,
+		T_date:     T_date,
+		T_remark:   T_remark,
+		T_detail:   T_detail,
+		T_approver: T_approver,
+		T_State:    Purchase.WaitPurchase,
+	}
+
+	o := orm.NewOrm()
+	PurchaseDao := Purchase.NewPurchase(o)
+
+	id, err := PurchaseDao.Add_Purchase(var_)
+	if err != nil {
+		//o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddNews(T_approver, fmt.Sprintf("【采购申请】您有一条%s的采购申请待审批", c.User.T_name), conf.PurchaseAuditUrl)
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "采购", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+	return
+}
+
+func (c *PurchaseController) Purchase_Approval() {
+
+	T_id, _ := c.GetInt("T_id")
+	T_State, _ := c.GetInt("T_State")
+
+	o := orm.NewOrm()
+	PurchaseDao := Purchase.NewPurchase(o)
+
+	purchase, err := PurchaseDao.Read_Purchase_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	if purchase.T_State == T_State {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
+		c.ServeJSON()
+		return
+	}
+	// 1 待采购  2 已采购
+	purchase.T_State = T_State
+	_, err = PurchaseDao.Update_Purchase(purchase, "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+	if T_State == Purchase.PurchaseCompleted {
+		NatsServer.AddNews(purchase.T_uuid, "【采购审核】您提交的采购申请已采购", conf.MyPurchaseNewsUrl)
+	}
+	NatsServer.AddUserLogs(c.User.T_uuid, "采购申请", "采购", purchase)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
+	c.ServeJSON()
+	return
+}
+func (c *PurchaseController) Purchase_Edit() {
+	T_id, _ := c.GetInt("T_id")
+	T_uuid := c.GetString("T_uuid")
+	T_date := c.GetString("T_date")
+	T_remark := c.GetString("T_remark")
+	T_State, _ := c.GetInt("T_State")
+	T_detail := c.GetString("T_detail")
+	T_approver := c.GetString("T_approver")
+
+	o := orm.NewOrm()
+	PurchaseDao := Purchase.NewPurchase(o)
+
+	purchase, err := PurchaseDao.Read_Purchase_ById(T_id)
+	if err != nil {
+		//o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	clos := []string{}
+	if len(T_uuid) > 0 {
+		purchase.T_uuid = T_uuid
+		clos = append(clos, "T_uuid")
+	}
+
+	if len(T_date) > 0 {
+		purchase.T_date = T_date
+		clos = append(clos, "T_date")
+	}
+
+	if len(T_remark) > 0 {
+		purchase.T_remark = T_remark
+		clos = append(clos, "T_remark")
+	}
+	if len(T_detail) > 0 {
+		purchase.T_detail = T_detail
+		clos = append(clos, "T_detail")
+	}
+	if len(T_approver) > 0 {
+		purchase.T_approver = T_approver
+		clos = append(clos, "T_approver")
+	}
+	if T_State > 0 {
+		purchase.T_State = T_State
+		clos = append(clos, "T_State")
+	}
+
+	_, err = PurchaseDao.Update_Purchase(purchase, clos...)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "采购", "修改", purchase)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: purchase.Id}
+	c.ServeJSON()
+	return
+}
+func (c *PurchaseController) Purchase_Del() {
+
+	T_id, _ := c.GetInt("T_id")
+
+	o := orm.NewOrm()
+	PurchaseDao := Purchase.NewPurchase(o)
+
+	purchase, err := PurchaseDao.Read_Purchase_ById(T_id)
+	if err != nil {
+		//o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	if purchase.T_State == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "已采购,禁止删除!"}
+		c.ServeJSON()
+		return
+	}
+
+	_, err = PurchaseDao.Delete_Purchase(purchase)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "采购", "删除", purchase.Id)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: purchase.Id}
+	c.ServeJSON()
+	return
+}

+ 1 - 0
controllers/Stock.go

@@ -723,6 +723,7 @@ func (c *StockController) StockIn_Add() {
 			snList := strings.Split(strings.Trim(T_relation_sn, ","), ",")
 			for _, sn := range snList {
 				mqtt := Stock.Read_MqttUser(sn)
+
 				// 添加设备
 				device := Stock.Device{
 					T_contract_number: "",

+ 1 - 0
controllers/Validation.go

@@ -204,6 +204,7 @@ func (c *ValidationController) UpdateValidationTool() {
 		}
 		if len(tool.T_project) != 0 {
 			con["t_project"] = tool.T_project
+			con["t_project_log"] = r.T_project_log + tool.T_project
 		}
 		con["update_time"] = time.Now().Format("2006-01-02 15:04:05")
 		err = vali.UpdateValidationTool(tool.T_sn, con)

+ 2 - 2
models/IOTNetworkCard/IOTNetworkCard.go

@@ -178,11 +178,11 @@ func (dao *IOTNetworkCardDaoImpl) DeleteDeduplicate() (int64, error) {
 }
 
 // 获取 ById
-func Read_IOTNetworkCard_ByT_MSISDN(T_MSISDN string) (r IOTNetworkCard, err error) {
+func Read_IOTNetworkCard_ByT_iccid(T_iccid string) (r IOTNetworkCard, err error) {
 	o := orm.NewOrm()
 	qs := o.QueryTable(new(IOTNetworkCard))
 
-	err = qs.Filter("T_MSISDN", T_MSISDN).Filter("T_State__gt", 0).One(&r)
+	err = qs.Filter("T_iccid", T_iccid).Filter("T_State__gt", 0).One(&r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 	}

+ 272 - 0
models/Purchase/Purchase.go

@@ -0,0 +1,272 @@
+package Purchase
+
+import (
+	"ERP_storage/logs"
+	"ERP_storage/models/Account"
+	"fmt"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
+	"strings"
+	"time"
+)
+
+const (
+	Delete            = iota
+	WaitPurchase      // 待审核
+	PurchaseCompleted // 进行中
+
+)
+
+// 项目管理
+type Purchase struct {
+	Id              int    `orm:"column(ID);size(11);auto;pk"`
+	T_uuid          string `orm:"index;size(32);null"` // 申请人
+	T_submit        string `orm:"index;size(32);null"` // 提交人
+	T_date          string `orm:"size(256);null"`      // 申请时间
+	T_detail        string `orm:"type(text);null"`     // 明细
+	T_remark        string `orm:"type(text);null"`     // 备注
+	T_approver      string `orm:"size(32);null"`       // 审批人
+	T_approver_date string `orm:"size(32);null"`       // 审批时间
+
+	T_State    int       `orm:"size(2);column(t_state);default(1)"`                    // 0 删除  1 待采购  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 *Purchase) TableName() string {
+	return "purchase"
+}
+
+type PurchaseDaoImpl struct {
+	orm orm.Ormer
+}
+
+func NewPurchase(orm orm.Ormer) *PurchaseDaoImpl {
+	return &PurchaseDaoImpl{orm: orm}
+}
+func init() {
+	//注册模型
+	orm2.Debug = true
+	orm.RegisterModel(new(Purchase))
+}
+
+type Purchase_R struct {
+	Id              int
+	T_uuid          string // 申请人
+	T_uuid_name     string // 申请人名称
+	T_submit        string // 提交人
+	T_submit_name   string // 提交人
+	T_date          string // 申请时间
+	T_remark        string // 备注
+	T_approver      string // 审批人
+	T_approver_name string // 审批人
+	T_approver_date string // 审批时间
+	T_State         int
+}
+
+type PurchaseDetail_R struct {
+	T_name           string // 名称
+	T_model          string // 型号
+	T_spec           string // 规格
+	T_quantity       int    // 数量
+	T_demand         string // 需求
+	T_remark         string // 备注
+	T_state          int    // 状态
+	T_date           string // 采购时间
+	T_unit_price     string // 采购单价
+	T_amount         string // 采购金额
+	T_reference_site string // 参考网址
+}
+type Purchase_Detail struct {
+	Id              int
+	T_uuid          string // 申请人
+	T_uuid_name     string // 用户名称
+	T_submit        string // 提交人
+	T_submit_name   string // 提交人
+	T_date          string // 申请时间
+	T_remark        string // 备注
+	T_approver      string // 审批人
+	T_approver_name string // 审批人
+	T_approver_date string // 审批时间
+	T_State         int
+	T_Detail        []PurchaseDetail_R // 项目明细
+}
+
+// ---------------- 特殊方法 -------------------
+func PurchaseToPurchase_R(t Purchase) (r Purchase_R) {
+
+	r.Id = t.Id
+	r.T_uuid = t.T_uuid
+	r.T_uuid_name = Account.Read_User_T_name_Get(t.T_uuid)
+	r.T_submit = t.T_submit
+	r.T_submit_name = Account.Read_User_T_name_Get(t.T_submit)
+	r.T_date = t.T_date
+	r.T_remark = t.T_remark
+	r.T_approver = t.T_approver
+	r.T_approver_name = Account.Read_User_T_name_Get(t.T_approver)
+	r.T_approver_date = t.T_approver_date
+	r.T_State = t.T_State
+
+	return r
+}
+func PurchaseToPurchase_Detail(t Purchase) (r Purchase_Detail) {
+
+	r.Id = t.Id
+	r.T_uuid = t.T_uuid
+	r.T_uuid_name = Account.Read_User_T_name_Get(t.T_uuid)
+	r.T_submit = t.T_submit
+	r.T_submit_name = Account.Read_User_T_name_Get(t.T_submit)
+	r.T_date = t.T_date
+	r.T_remark = t.T_remark
+	r.T_approver = t.T_approver
+	r.T_approver_name = Account.Read_User_T_name_Get(t.T_approver)
+	r.T_approver_date = t.T_approver_date
+	r.T_State = t.T_State
+	r.T_Detail = PurchaseToPurchaseDetail(t.T_detail)
+	return r
+}
+
+func PurchaseToPurchaseDetail(T_detail string) (r []PurchaseDetail_R) {
+
+	if len(T_detail) == 0 {
+		return
+	}
+
+	detailList := strings.Split(strings.Trim(T_detail, "|"), "|")
+
+	for _, detail := range detailList {
+		T_name := strings.Split(detail, ",")[0]
+		T_model := strings.Split(detail, ",")[1]
+		T_spec := strings.Split(detail, ",")[2]
+		T_quantity := strings.Split(detail, ",")[3]
+		T_demand := strings.Split(detail, ",")[4]
+		T_remark := strings.Split(detail, ",")[5]
+		T_state := strings.Split(detail, ",")[6]
+		T_date := strings.Split(detail, ",")[7]
+		T_unit_price := strings.Split(detail, ",")[8]
+		T_amount := strings.Split(detail, ",")[9]
+		T_reference_site := strings.Split(detail, ",")[10]
+
+		r = append(r, PurchaseDetail_R{
+			T_name:           T_name,
+			T_model:          T_model,
+			T_spec:           T_spec,
+			T_quantity:       lib.To_int(T_quantity),
+			T_demand:         T_demand,
+			T_remark:         T_remark,
+			T_state:          lib.To_int(T_state),
+			T_date:           T_date,
+			T_unit_price:     T_unit_price,
+			T_amount:         T_amount,
+			T_reference_site: T_reference_site,
+		})
+	}
+	return r
+}
+
+func (dao *PurchaseDaoImpl) Read_Purchase_ById(id int) (r Purchase, err error) {
+	o := orm.NewOrm()
+	r = Purchase{Id: id}
+	err = o.Read(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return r, err
+	}
+	return r, err
+}
+
+// 添加
+func (dao *PurchaseDaoImpl) Add_Purchase(m Purchase) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(&m)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	return
+}
+
+// 修改
+func (dao *PurchaseDaoImpl) Update_Purchase(m Purchase, cols ...string) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Update(&m, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	fmt.Println("Number of records updated in database:", id)
+	return id, nil
+}
+
+// 删除
+func (dao *PurchaseDaoImpl) Delete_Purchase(m Purchase) (id int64, err error) {
+
+	o := orm.NewOrm()
+	m.T_State = Delete
+	id, err = o.Update(&m, "T_State")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	fmt.Println("Number of records updated in database:", id)
+	return id, nil
+}
+
+// 获取列表
+func (dao *PurchaseDaoImpl) Read_Purchase_List(T_uid, T_approver string, T_state int, T_start_date, T_end_date string, page, page_z int) (r []Purchase_R, cnt int64) {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var map_r []Purchase
+	qs := o.QueryTable(new(Purchase))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition()
+	cond = cond.And("T_State__gt", Delete)
+	if len(T_uid) > 0 {
+		cond = cond.AndCond(cond.Or("T_uuid", T_uid).Or("T_submit", T_uid))
+	}
+	// 审批人
+	if len(T_approver) > 0 {
+		cond = cond.And("T_approver", T_approver)
+	}
+	if T_state > 0 {
+		cond = cond.And("T_state", T_state)
+	}
+	if len(T_start_date) > 0 {
+		cond = cond.And("T_date__gte", T_start_date)
+	}
+
+	if len(T_start_date) > 0 {
+		cond = cond.And("T_date__lte", T_end_date)
+	}
+	var err error
+	if page_z == 9999 {
+		_, err = qs.SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&map_r)
+	} else {
+		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&map_r)
+	}
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range map_r {
+		r = append(r, PurchaseToPurchase_R(v))
+	}
+
+	return r, cnt
+
+}

+ 7 - 0
models/Stock/Device.go

@@ -3,6 +3,7 @@ package Stock
 import (
 	"ERP_storage/logs"
 	"ERP_storage/models/Basic"
+	"ERP_storage/models/IOTNetworkCard"
 	"errors"
 	"fmt"
 	_ "github.com/astaxie/beego/cache/redis"
@@ -26,6 +27,7 @@ type Device struct {
 	T_remark          string    `orm:"type(text);null"`                                       // 备注
 	T_project         string    `orm:"type(text);null"`                                       // 出库项目
 	T_project_log     string    `orm:"type(text);null"`                                       // 出库项目
+	T_device_number   string    `orm:"size(256);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 保存时都会对时间自动更新
 }
@@ -69,6 +71,8 @@ type Device_R struct {
 	T_product_model      string
 	T_product_spec       string
 	T_product_img        string
+
+	T_device_number string // 设备编号
 }
 
 func DeviceToDevice_R(t Device_R) (r Device_R) {
@@ -94,6 +98,9 @@ func DeviceToDevice_R(t Device_R) (r Device_R) {
 
 	r.T_product_class_name = Basic.Read_ProductClass_Get(t.T_product_class)
 
+	card, _ := IOTNetworkCard.Read_IOTNetworkCard_ByT_iccid(r.T_iccid)
+	r.T_device_number = card.T_device_number
+
 	return r
 }
 

+ 2 - 0
models/init.go

@@ -5,6 +5,7 @@ import (
 	"ERP_storage/models/ContractReview"
 	"ERP_storage/models/IOTNetworkCard"
 	"ERP_storage/models/Percentage"
+	"ERP_storage/models/Purchase"
 	"ERP_storage/models/RepairWorkOrder"
 	"ERP_storage/models/validationtool"
 	_ "github.com/go-sql-driver/mysql"
@@ -29,6 +30,7 @@ func AutoMigrateDB() {
 			&Percentage.VerifyCompany{},
 			&Percentage.Percentage{},
 			&RepairWorkOrder.RepairWorkOrder{},
+			&Purchase.Purchase{},
 		)
 	if err != nil {
 		log.Fatalf("migrate db fail: %v", err)

+ 1 - 1
models/validationtool/validation.go

@@ -20,7 +20,7 @@ type ValidationTool struct {
 	T_imei           string    `orm:"size(256);null"`                                        // 模组imei
 	History_iccid    string    `orm:"size(256);type(json);null"`                             // 历史sim卡号
 	History_imei     string    `orm:"size(256);type(json);null"`                             // 历史模组
-	T_state          int       `orm:"size(2);default(2)"`                                    // 1-已出库 2-待使用  3-维修中 4-已报废
+	T_state          int       `orm:"size(2);default(2)"`                                    // 1-已出库 2-待使用(已入库)  3-维修中 4-已报废
 	T_remark         string    `orm:"type(text);null"`                                       // 备注
 	T_project        string    `orm:"type(text);null"`                                       // 出库项目
 	T_project_log    string    `orm:"type(text);null"`                                       // 出库项目

+ 20 - 0
routers/Purchase.go

@@ -0,0 +1,20 @@
+package routers
+
+import (
+	"ERP_storage/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+
+	Purchase := beego.NewNamespace("/Purchase",
+		beego.NSRouter("/List", &controllers.PurchaseController{}, "*:Purchase_List"),           // 管理员列表
+		beego.NSRouter("/User_list", &controllers.PurchaseController{}, "*:Purchase_User_List"), // 用户列表
+		beego.NSRouter("/Add", &controllers.PurchaseController{}, "*:Purchase_Add"),             // 添加项目
+		beego.NSRouter("/Get", &controllers.PurchaseController{}, "*:Purchase_Get"),             // 项目详情
+		beego.NSRouter("/Edit", &controllers.PurchaseController{}, "*:Purchase_Edit"),           // 修改项目
+		beego.NSRouter("/Approval", &controllers.PurchaseController{}, "*:Purchase_Approval"),   // 项目审批
+		beego.NSRouter("/Del", &controllers.PurchaseController{}, "*:Purchase_Del"),             // 删除项目
+	)
+	beego.AddNamespace(Purchase)
+}