Explorar el Código

feat: 新增安全巡检相关接口

lanjianrong hace 4 años
padre
commit
5cb7f3f62a

+ 1 - 1
conf/project.go

@@ -39,7 +39,7 @@ var SignSecret = "cpcm005687gokaif"
 var CookieSecret = "cm_login_account"
 
 // nodejs rpc 服务端
-const NodeRpcHost = "localhost:50051"
+const NodeRpcHost = "192.168.1.47:50051"
 
 // 是否需要启动全局计划任务服务
 var RunningCrontabService = false

+ 108 - 0
dao/quality_audit_dao.go

@@ -0,0 +1,108 @@
+/*
+ * @description: 安全巡检数据库操作相关
+ * @Author: LanJianRong
+ * @Date: 2020-11-20
+ * @FilePath: \construction_management\dao\quality_dao.go
+ */
+
+package dao
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/go-xorm/xorm"
+	"go.mod/comm"
+	"go.mod/conf"
+	"go.mod/models"
+	"go.mod/web/viewmodels"
+)
+
+//数据库操作引擎
+type QualityAuditDao struct {
+	engine *xorm.Engine
+}
+
+//获得一个DAO对象
+func NewQualityAuditDao(engine *xorm.Engine) *QualityAuditDao {
+	return &QualityAuditDao{
+		engine: engine,
+	}
+}
+
+// 添加审批记录
+func (d *QualityAuditDao) AddAuditRecord(qualityId int, bId int, auditId int, times int, status int, progress int, opinion string, rectifiedInfo string) error {
+	auditor := &models.CmQualityAudit{QualityId: qualityId, BidsectionId: bId, AuditId: auditId, Times: times, CreateTime: time.Now(), Status: status, Progress: progress, Opinion: opinion, Rectifiedinfo: rectifiedInfo}
+	_, err := d.engine.InsertOne(auditor)
+	return err
+}
+
+// 获取最新审批顺序
+func (d *QualityAuditDao) GetNewOrder(qualityId int, times int) int {
+	var max_order int
+	_, err := d.engine.Sql("select Max(`audit_order`) as max_order from cm_quality_audit where quality_id = ? and times = ?", qualityId, times).Get(&max_order)
+	fmt.Println(err)
+	if max_order == 0 {
+		return 1
+	} else {
+		return max_order + 1
+	}
+}
+
+// times从1开始循环,往history里面push
+func (d *QualityAuditDao) GetAuditHistory(id int, times int) map[int][]viewmodels.HistoryQualityAudit {
+	auditorHistory := make(map[int][]viewmodels.HistoryQualityAudit, 0)
+	for i := 1; i <= times; i++ {
+		auditors := make([]viewmodels.HistoryQualityAudit, 0)
+		d.engine.Sql("select ca.`id`, pa.`name`, pa.`position`, ca.`create_time`, ca.progress, ca.opinion, ca.status from `cm_project_account` as pa, `cm_Quality_audit` as ca where ca.`Quality_id` = ? and ca.`audit_id` = pa.`id` and times = ? order by id desc", id, i).Find(&auditors)
+		auditorsArr := make([]viewmodels.HistoryQualityAudit, 0)
+		for _, auditor := range auditors {
+			auditorVM := viewmodels.HistoryQualityAudit{}
+			id, _ := comm.AesEncrypt(auditor.Id, conf.SignSecret)
+			auditorVM.Id = id
+			auditorVM.CreateTime = auditor.CreateTime
+			auditorVM.Name = auditor.Name
+			auditorVM.Position = auditor.Position
+			auditorVM.Status = auditor.Status
+			auditorVM.Opinion = auditor.Opinion
+			auditorVM.Progress = auditor.Progress
+			auditorsArr = append(auditorsArr, auditorVM)
+		}
+		auditorHistory[i] = auditorsArr
+	}
+	return auditorHistory
+}
+
+// 根据id获取记录
+func (d *QualityAuditDao) FindById(id int) (*models.CmQualityAudit, error) {
+	data := &models.CmQualityAudit{Id: id}
+	_, err := d.engine.Get(data)
+	return data, err
+}
+
+// 查找最新的整改单
+func (d *QualityAuditDao) GetLastedOrder(QualityId int) ([]viewmodels.CheckOrderVM, error) {
+	data := make([]viewmodels.CheckOrderVM, 0)
+	err := d.engine.Sql("select cm.`rectifiedInfo` as opinion, cm.`create_time`, pa.`name` from `cm_Quality_audit` as cm left join `cm_project_account` as pa on pa.`id` = cm.`audit_id` where cm.`Quality_id` = ? and cm.`progress` = ?", QualityId, 2).Find(&data)
+	return data, err
+}
+
+// 插入审批记录
+func (d *QualityAuditDao) InsertData(data models.CmQualityAudit) error {
+	_, err := d.engine.Insert(&data)
+	return err
+}
+
+// 改变下一条审批记录为待审核状态
+func (d *QualityAuditDao) ChangeNextRecord(times int, audit_order int) error {
+	data := &models.CmQualityAudit{Status: 1, CreateTime: time.Now()}
+	_, err := d.engine.Where("times = ? and audit_order = ?", times, audit_order).Update(data)
+	return err
+}
+
+// 获取最后一个审批人
+func (d *QualityAuditDao) GetLastAuditor(times int, QualityId int) (*models.CmQualityAudit, error) {
+	data := &models.CmQualityAudit{}
+	_, err := d.engine.Where("times = ? and Quality_id = ?", times, QualityId).Desc("audit_order").Limit(1).Get(data)
+	return data, err
+}

+ 114 - 0
dao/quality_dao.go

@@ -0,0 +1,114 @@
+/*
+ * @description: 安全巡检数据库操作相关
+ * @Author: LanJianRong
+ * @Date: 2020-11-20
+ * @FilePath: \construction_management\dao\Quality_dao.go
+ */
+
+package dao
+
+import (
+	"fmt"
+
+	"github.com/go-xorm/xorm"
+	"go.mod/models"
+)
+
+//数据库操作引擎
+type QualityDao struct {
+	engine *xorm.Engine
+}
+
+//获得一个DAO对象
+func NewQualityDao(engine *xorm.Engine) *QualityDao {
+	return &QualityDao{
+		engine: engine,
+	}
+}
+
+func (d *QualityDao) FindById(id int) *models.CmQuality {
+	data := &models.CmQuality{Id: id}
+	ok, err := d.engine.Get(data)
+	if ok && err == nil {
+		return data
+	} else {
+		data.Id = 0
+		return data
+	}
+}
+
+// id获得数据
+func (d *QualityDao) GetListByBid(id int, pageNo int, pageSize int) ([]models.CmQuality, int64) {
+	dataList := make([]models.CmQuality, 0)
+	start := (pageNo - 1) * pageSize
+	total, err := d.engine.
+		Where("bidsection_id=?", id).
+		Asc("id").
+		Limit(pageSize, start).
+		FindAndCount(&dataList)
+	if err != nil {
+		return dataList, 0
+	}
+	return dataList, total
+}
+
+// 插入单条记录
+func (d *QualityDao) InsertRecord(data models.CmQuality) (bool, error) {
+	affected, err := d.engine.InsertOne(data)
+	return affected > 0, err
+}
+
+// 删除记录
+func (d *QualityDao) DeleteRecord(id int) (bool, error) {
+	Quality := models.CmQuality{}
+	affected, err := d.engine.Id(id).Delete(Quality)
+	return affected > 0, err
+}
+
+// 根据code获取记录
+func (d *QualityDao) FindByCode(code string) bool {
+	data := &models.CmQuality{Code: code}
+	has, _ := d.engine.Get(data)
+	return has
+}
+
+// 筛选出应用了当前规则的条数
+func (d *QualityDao) CountRuleCode(bid int) (int64, error) {
+	data := &models.CmQuality{}
+	total, err := d.engine.Where("`bidsection_id` = ?", bid).Count(data)
+	if err != nil {
+		total = 0
+	}
+	return total, err
+}
+
+// 更改status
+func (d *QualityDao) ChangeStatus(id int, status int) error {
+	data := &models.CmQuality{Status: status}
+	_, err := d.engine.ID(id).Update(data)
+	return err
+}
+
+// 获得某状态下的安全
+func (d *QualityDao) GetStatus(bidsectionId int, status int) []models.CmQuality {
+	datalist := make([]models.CmQuality, 0)
+	_ = d.engine.
+		Where("bidsection_id = ? and status=? ", bidsectionId, status).
+		Desc("id").
+		Find(&datalist)
+	return datalist
+}
+
+// 获得某年份下的安全
+func (d *QualityDao) GetTypeYear(bidsectionId int, year int) []models.CmQuality {
+
+	startYear := fmt.Sprintf("%d-01-01:00.00.00", year)
+	endYear := fmt.Sprintf("%d-12-31:23.59.59", year)
+
+	datalist := make([]models.CmQuality, 0)
+	_ = d.engine.
+		Where("bidsection_id = ? and create_time>='"+startYear+"' and create_time<='"+endYear+"' ", bidsectionId).
+		Desc("id").
+		Find(&datalist)
+	return datalist
+}

+ 0 - 464
proto/safe.pb.go

@@ -1,464 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.25.0
-// 	protoc        v3.9.0
-// source: safe.proto
-
-package proto
-
-import (
-	context "context"
-	proto "github.com/golang/protobuf/proto"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	reflect "reflect"
-	sync "sync"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-// This is a compile-time assertion that a sufficiently up-to-date version
-// of the legacy proto package is being used.
-const _ = proto.ProtoPackageIsVersion4
-
-// The request message containing the user's name.
-type SafeGetRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
-}
-
-func (x *SafeGetRequest) Reset() {
-	*x = SafeGetRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_safe_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *SafeGetRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SafeGetRequest) ProtoMessage() {}
-
-func (x *SafeGetRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_safe_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use SafeGetRequest.ProtoReflect.Descriptor instead.
-func (*SafeGetRequest) Descriptor() ([]byte, []int) {
-	return file_safe_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *SafeGetRequest) GetId() int32 {
-	if x != nil {
-		return x.Id
-	}
-	return 0
-}
-
-type SafePostRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	BidsectionId int32  `protobuf:"varint,1,opt,name=bidsection_id,json=bidsectionId,proto3" json:"bidsection_id,omitempty"`
-	Code         string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"`
-	Position     string `protobuf:"bytes,3,opt,name=position,proto3" json:"position,omitempty"`
-	CreateTime   string `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
-	Inspection   string `protobuf:"bytes,5,opt,name=inspection,proto3" json:"inspection,omitempty"`
-}
-
-func (x *SafePostRequest) Reset() {
-	*x = SafePostRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_safe_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *SafePostRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SafePostRequest) ProtoMessage() {}
-
-func (x *SafePostRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_safe_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use SafePostRequest.ProtoReflect.Descriptor instead.
-func (*SafePostRequest) Descriptor() ([]byte, []int) {
-	return file_safe_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *SafePostRequest) GetBidsectionId() int32 {
-	if x != nil {
-		return x.BidsectionId
-	}
-	return 0
-}
-
-func (x *SafePostRequest) GetCode() string {
-	if x != nil {
-		return x.Code
-	}
-	return ""
-}
-
-func (x *SafePostRequest) GetPosition() string {
-	if x != nil {
-		return x.Position
-	}
-	return ""
-}
-
-func (x *SafePostRequest) GetCreateTime() string {
-	if x != nil {
-		return x.CreateTime
-	}
-	return ""
-}
-
-func (x *SafePostRequest) GetInspection() string {
-	if x != nil {
-		return x.Inspection
-	}
-	return ""
-}
-
-// The response message containing the greetings
-type SafeReply struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Code int32  `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
-	Data string `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
-	Msg  string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
-}
-
-func (x *SafeReply) Reset() {
-	*x = SafeReply{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_safe_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *SafeReply) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SafeReply) ProtoMessage() {}
-
-func (x *SafeReply) ProtoReflect() protoreflect.Message {
-	mi := &file_safe_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use SafeReply.ProtoReflect.Descriptor instead.
-func (*SafeReply) Descriptor() ([]byte, []int) {
-	return file_safe_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *SafeReply) GetCode() int32 {
-	if x != nil {
-		return x.Code
-	}
-	return 0
-}
-
-func (x *SafeReply) GetData() string {
-	if x != nil {
-		return x.Data
-	}
-	return ""
-}
-
-func (x *SafeReply) GetMsg() string {
-	if x != nil {
-		return x.Msg
-	}
-	return ""
-}
-
-var File_safe_proto protoreflect.FileDescriptor
-
-var file_safe_proto_rawDesc = []byte{
-	0x0a, 0x0a, 0x73, 0x61, 0x66, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x53, 0x61, 0x66, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0xa7, 0x01, 0x0a, 0x0f, 0x53, 0x61, 0x66, 0x65, 0x50, 0x6f,
-	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x69, 0x64,
-	0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x0c, 0x62, 0x69, 0x64, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12,
-	0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
-	0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f,
-	0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,
-	0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22,
-	0x45, 0x0a, 0x09, 0x53, 0x61, 0x66, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04,
-	0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,
-	0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0x78, 0x0a, 0x04, 0x53, 0x61, 0x66, 0x65, 0x12, 0x38,
-	0x0a, 0x0b, 0x67, 0x65, 0x74, 0x53, 0x61, 0x66, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x15, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x66, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x66,
-	0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x74,
-	0x53, 0x61, 0x66, 0x65, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x66,
-	0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x66, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00,
-	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_safe_proto_rawDescOnce sync.Once
-	file_safe_proto_rawDescData = file_safe_proto_rawDesc
-)
-
-func file_safe_proto_rawDescGZIP() []byte {
-	file_safe_proto_rawDescOnce.Do(func() {
-		file_safe_proto_rawDescData = protoimpl.X.CompressGZIP(file_safe_proto_rawDescData)
-	})
-	return file_safe_proto_rawDescData
-}
-
-var file_safe_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
-var file_safe_proto_goTypes = []interface{}{
-	(*SafeGetRequest)(nil),  // 0: proto.SafeGetRequest
-	(*SafePostRequest)(nil), // 1: proto.SafePostRequest
-	(*SafeReply)(nil),       // 2: proto.SafeReply
-}
-var file_safe_proto_depIdxs = []int32{
-	0, // 0: proto.Safe.getSafeList:input_type -> proto.SafeGetRequest
-	1, // 1: proto.Safe.postSafe:input_type -> proto.SafePostRequest
-	2, // 2: proto.Safe.getSafeList:output_type -> proto.SafeReply
-	2, // 3: proto.Safe.postSafe:output_type -> proto.SafeReply
-	2, // [2:4] is the sub-list for method output_type
-	0, // [0:2] is the sub-list for method input_type
-	0, // [0:0] is the sub-list for extension type_name
-	0, // [0:0] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_safe_proto_init() }
-func file_safe_proto_init() {
-	if File_safe_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_safe_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SafeGetRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_safe_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SafePostRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_safe_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SafeReply); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_safe_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   3,
-			NumExtensions: 0,
-			NumServices:   1,
-		},
-		GoTypes:           file_safe_proto_goTypes,
-		DependencyIndexes: file_safe_proto_depIdxs,
-		MessageInfos:      file_safe_proto_msgTypes,
-	}.Build()
-	File_safe_proto = out.File
-	file_safe_proto_rawDesc = nil
-	file_safe_proto_goTypes = nil
-	file_safe_proto_depIdxs = nil
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConnInterface
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
-
-// SafeClient is the client API for Safe service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type SafeClient interface {
-	// Sends a greeting
-	GetSafeList(ctx context.Context, in *SafeGetRequest, opts ...grpc.CallOption) (*SafeReply, error)
-	PostSafe(ctx context.Context, in *SafePostRequest, opts ...grpc.CallOption) (*SafeReply, error)
-}
-
-type safeClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewSafeClient(cc grpc.ClientConnInterface) SafeClient {
-	return &safeClient{cc}
-}
-
-func (c *safeClient) GetSafeList(ctx context.Context, in *SafeGetRequest, opts ...grpc.CallOption) (*SafeReply, error) {
-	out := new(SafeReply)
-	err := c.cc.Invoke(ctx, "/proto.Safe/getSafeList", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *safeClient) PostSafe(ctx context.Context, in *SafePostRequest, opts ...grpc.CallOption) (*SafeReply, error) {
-	out := new(SafeReply)
-	err := c.cc.Invoke(ctx, "/proto.Safe/postSafe", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// SafeServer is the server API for Safe service.
-type SafeServer interface {
-	// Sends a greeting
-	GetSafeList(context.Context, *SafeGetRequest) (*SafeReply, error)
-	PostSafe(context.Context, *SafePostRequest) (*SafeReply, error)
-}
-
-// UnimplementedSafeServer can be embedded to have forward compatible implementations.
-type UnimplementedSafeServer struct {
-}
-
-func (*UnimplementedSafeServer) GetSafeList(context.Context, *SafeGetRequest) (*SafeReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetSafeList not implemented")
-}
-func (*UnimplementedSafeServer) PostSafe(context.Context, *SafePostRequest) (*SafeReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method PostSafe not implemented")
-}
-
-func RegisterSafeServer(s *grpc.Server, srv SafeServer) {
-	s.RegisterService(&_Safe_serviceDesc, srv)
-}
-
-func _Safe_GetSafeList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SafeGetRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(SafeServer).GetSafeList(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/proto.Safe/GetSafeList",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(SafeServer).GetSafeList(ctx, req.(*SafeGetRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Safe_PostSafe_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SafePostRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(SafeServer).PostSafe(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/proto.Safe/PostSafe",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(SafeServer).PostSafe(ctx, req.(*SafePostRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Safe_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "proto.Safe",
-	HandlerType: (*SafeServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "getSafeList",
-			Handler:    _Safe_GetSafeList_Handler,
-		},
-		{
-			MethodName: "postSafe",
-			Handler:    _Safe_PostSafe_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "safe.proto",
-}

+ 137 - 0
services/quality_audit.service.go

@@ -0,0 +1,137 @@
+/*
+ * @description: 安全巡检审批相关
+ * @Author: LanJianRong
+ * @Date: 2020-12-18
+ * @FilePath: \construction_management\web\api\safe_rpc_api.go
+ */
+package services
+
+import (
+	"errors"
+	"log"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/dao"
+	"go.mod/datasource"
+	"go.mod/web/viewmodels"
+)
+
+type QualityAuditService interface {
+	ValidRule(ctx iris.Context) (viewmodels.QualityAudit, error)
+	ValidStart(ctx iris.Context) (viewmodels.QualityAuditStart, error)
+	// AddAuditor(safeId int, bId int, auditId int, times int) error
+	CloseAudit(id int, opinion string, curUid int, saveId int) error
+	BackAudit(id int, opinion string, curUid int, saveId int, auditId int) error
+	PassAudit(id int, uid int, auditId int, opinion string, rectifiedInfo string) error
+	StartAudit(safeId int, bidsectionId int, auditors []int, reAuditors []int, uid int, pid int) error
+}
+
+type qualityAuditService struct {
+	validAdd        string
+	validPass       string
+	validClose      string
+	validBack       string
+	daoQualityAudit *dao.QualityAuditDao
+	daoQuality      *dao.QualityDao
+	daoApprover     *dao.ApproverDao
+}
+
+//创建项目用户service
+func NewQualityAuditService() QualityAuditService {
+	return &qualityAuditService{
+		validBack:       "/api/quality_audit/back",
+		validAdd:        "/api/quality_audit/add",
+		validClose:      "/api/quality_audit/close",
+		validPass:       "/api/quality_audit/pass",
+		daoQualityAudit: dao.NewQualityAuditDao(datasource.InstanceDbMaster()),
+		daoQuality:      dao.NewQualityDao(datasource.InstanceDbMaster()),
+		daoApprover:     dao.NewApproverDao(datasource.InstanceDbMaster()),
+	}
+}
+
+// 关闭审批流程
+func (s *qualityAuditService) CloseAudit(id int, opinion string, curUid int, saveId int) error {
+	err := s.daoApprover.CloseHandler(id, opinion, curUid, saveId)
+	return err
+}
+
+// 审批退回
+func (s *qualityAuditService) BackAudit(id int, opinion string, curUid int, saveId int, auditId int) error {
+	auditor, err := s.daoApprover.FindApproverById(id)
+	if auditor.AuditId != curUid {
+		return errors.New("该用户没有审批权限!")
+	}
+	safe := s.daoQuality.FindById(saveId)
+
+	// 退回到了检查人
+	if auditId == 0 {
+		// 初始化审批流程
+		err = s.daoApprover.InitStatus(auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditId, safe.Times, auditor.Progress+1, opinion)
+	} else {
+		// 退回到审批流程中的某一个人
+		err = s.daoApprover.BackHandlerWithId(auditId, auditor.AuditId, safe.Times, auditor.Progress+1, opinion)
+	}
+	return err
+
+}
+
+// 审批通过
+func (s *qualityAuditService) PassAudit(id int, uid int, auditId int, opinion string, rectifiedInfo string) error {
+	err := s.daoApprover.PassHandler(id, uid, auditId, opinion, rectifiedInfo)
+	return err
+}
+
+func (s *qualityAuditService) StartAudit(safeId int, bidsectionId int, auditors []int, reAuditors []int, uid int, pid int) error {
+	safe := s.daoQuality.FindById(safeId)
+	if safe.Uid != uid {
+		return errors.New("该用户没有操作权限!")
+	}
+	// 清除可能有的旧的审批流程
+	err := s.daoApprover.DeleteOldAuditors(bidsectionId, 1, safeId)
+	// 增加审批日志
+	err = s.daoQualityAudit.AddAuditRecord(safeId, bidsectionId, uid, safe.Times, 0, 0, "", "")
+	// 改变安全巡检表的状态
+	err = s.daoQuality.ChangeStatus(safeId, 1)
+	// 创建审批流程
+	err = s.daoApprover.InsertData(bidsectionId, pid, 1, safeId, auditors, reAuditors)
+	return err
+}
+
+// 规则校验
+func (s *qualityAuditService) ValidRule(ctx iris.Context) (viewmodels.QualityAudit, error) {
+	qualityAuditVaild := viewmodels.QualityAudit{}
+	if ctx.Method() == "POST" {
+		err := ctx.ReadJSON(&qualityAuditVaild)
+		if err != nil {
+			log.Println("quality-ValidRule-ReadJson转换异常, error=", err)
+			return qualityAuditVaild, err
+		}
+		if ctx.Path() == s.validAdd {
+			err = qualityAuditVaild.ValidateQualityAddAuditor()
+			return qualityAuditVaild, err
+		} else if ctx.Path() == s.validClose {
+			err = qualityAuditVaild.ValidateQualityClose()
+			return qualityAuditVaild, err
+		} else if ctx.Path() == s.validBack {
+			err = qualityAuditVaild.ValidateQualityBack()
+			return qualityAuditVaild, err
+		} else if ctx.Path() == s.validPass {
+			err = qualityAuditVaild.ValidateQualityPass()
+			return qualityAuditVaild, err
+		}
+		return qualityAuditVaild, err
+	}
+	return qualityAuditVaild, nil
+}
+
+// 校验审批开始
+func (s *qualityAuditService) ValidStart(ctx iris.Context) (viewmodels.QualityAuditStart, error) {
+	startAuditValid := viewmodels.QualityAuditStart{}
+	err := ctx.ReadJSON(&startAuditValid)
+	if err != nil {
+		log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
+		return startAuditValid, err
+	}
+	err = startAuditValid.ValidateQualityStart()
+	return startAuditValid, err
+}

+ 274 - 0
services/quality_service.go

@@ -0,0 +1,274 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"log"
+	"strconv"
+	"time"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/comm"
+	"go.mod/conf"
+	"go.mod/dao"
+	"go.mod/datasource"
+	"go.mod/models"
+	"go.mod/web/viewmodels"
+)
+
+type QualityService interface {
+	Get(id int, pid int, pageNo int, pageSize int) ([]viewmodels.QualityList, int64)
+	Post(data models.CmQuality) error
+	Del(id int) error
+	GetDetail(id int, pid int) viewmodels.QualityDetail
+	GetSurvey(projectId int, bidsectionId int) map[string]interface{}
+	ValidRule(ctx iris.Context) (viewmodels.Quality, error)
+}
+
+// //返回service操作类
+type qualityService struct {
+	daoQuality        *dao.QualityDao
+	daoQualityAudit   *dao.QualityAuditDao
+	daoProjectAccount *dao.ProjectAccountDao
+	daoAnnex          *dao.AnnexDao
+	daoRule           *dao.RuleDao
+	daoApprover       *dao.ApproverDao
+	validDetail       string
+}
+
+//创建项目用户service
+func NewQualityService() QualityService {
+	return &qualityService{
+		validDetail:       "/api/quality/detail",
+		daoQuality:        dao.NewQualityDao(datasource.InstanceDbMaster()),
+		daoAnnex:          dao.NewAnnexDao(datasource.InstanceDbMaster()),
+		daoQualityAudit:   dao.NewQualityAuditDao(datasource.InstanceDbMaster()),
+		daoProjectAccount: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
+		daoApprover:       dao.NewApproverDao(datasource.InstanceDbMaster()),
+	}
+}
+func (s *qualityService) Get(id int, pid int, pageNo int, pageSize int) ([]viewmodels.QualityList, int64) {
+	datalist, total := s.daoQuality.GetListByBid(id, pageNo, pageSize)
+	qualityList := make([]viewmodels.QualityList, 0)
+	for _, item := range datalist {
+		qualityVM := viewmodels.QualityList{}
+		qualityVM.Code = item.Code
+		account := s.daoProjectAccount.Get(item.Uid, pid)
+		qualityVM.AuditName = account.Name
+		qualityVM.CreateTime = item.CreateTime.Format(conf.SysTimeform)
+		qualityVM.Demand = item.Demand
+		id, _ := comm.AesEncrypt(strconv.Itoa(item.Id), conf.SignSecret)
+		qualityVM.Id = id
+		qualityVM.Inspection = item.Inspection
+		qualityVM.InspectionDetail = item.InspectionDetail
+		qualityVM.Position = item.Position
+		qualityVM.Status = item.Status
+		counts, _ := s.daoAnnex.GetCount(3, item.Id)
+		qualityVM.FileCounts = counts
+		qualityList = append(qualityList, qualityVM)
+	}
+	return qualityList, total
+}
+
+// post请求,插入单条数据
+func (s *qualityService) Post(data models.CmQuality) error {
+	has := s.daoQuality.FindByCode(data.Code)
+	if has {
+		return errors.New("该编号已存在!")
+	}
+	Inserted, err := s.daoQuality.InsertRecord(data)
+	if Inserted == true {
+		return nil
+	}
+	return err
+}
+
+// delete请求,删除数据
+func (s *qualityService) Del(id int) error {
+	Deleted, err := s.daoQuality.DeleteRecord(id)
+	if Deleted == true {
+		return nil
+	}
+	return err
+}
+
+// 详情页数据拼装
+func (s *qualityService) GetDetail(id int, pid int) viewmodels.QualityDetail {
+
+	qualityData := s.daoQuality.FindById(id)
+	// fmt.Println(safeData)
+	qualityId, _ := comm.AesEncrypt(strconv.Itoa(qualityData.Id), conf.SignSecret)
+	bid, _ := comm.AesEncrypt(strconv.Itoa(qualityData.BidsectionId), conf.SignSecret)
+	uid, _ := comm.AesEncrypt(strconv.Itoa(qualityData.Uid), conf.SignSecret)
+	data := viewmodels.QualityDetail{}
+	data.Id = qualityId
+	data.BidsectionId = bid
+	data.Uid = uid
+	data.Code = qualityData.Code
+	data.Inspection = qualityData.Inspection
+	data.InspectionDetail = qualityData.InspectionDetail
+	data.Demand = qualityData.Demand
+	account := s.daoProjectAccount.Get(qualityData.Uid, pid)
+	data.AuditName = account.Name
+	data.CreateTime = qualityData.CreateTime
+	data.Times = qualityData.Times
+	data.Status = qualityData.Status
+	fileList, total := s.daoAnnex.GetList(3, qualityData.Id, 1, conf.PageSize)
+	// 加密id
+	fileArr := make([]viewmodels.AnnexListView, 0)
+	for _, item := range fileList {
+		fileListVM := viewmodels.AnnexListView{}
+		fileId, _ := comm.AesEncrypt(item.Id, conf.SignSecret)
+		fileListVM.Id = fileId
+		uid, _ := comm.AesEncrypt(item.AccountId, conf.SignSecret)
+		fileListVM.AccountId = uid
+		fileListVM.AccountName = item.AccountName
+		fileListVM.CreateTime = item.CreateTime
+		fileListVM.FileName = item.FileName
+		fileListVM.FilePath = item.FilePath
+		fileArr = append(fileArr, fileListVM)
+	}
+	fileVM := viewmodels.FileStruct{}
+	fileVM.FileList = fileArr
+	fileVM.Total = total
+	data.File = fileVM
+	auditors := s.daoApprover.GetAuditorsWithOwner(qualityData.BidsectionId, int(1), qualityData.Id, account.Id)
+	encryptAuditors := make([]viewmodels.Auditors, 0)
+	for _, item := range auditors {
+		auditorVM := viewmodels.Auditors{}
+		if item.Id != "" {
+			id, _ := comm.AesEncrypt(item.Id, conf.SignSecret)
+			auditorVM.Id = id
+		}
+		auditId, _ := comm.AesEncrypt(item.AuditId, conf.SignSecret)
+		auditorVM.AuditId = auditId
+		auditorVM.Name = item.Name
+		auditorVM.Position = item.Position
+		auditorVM.Mobile = item.Mobile
+		auditorVM.AuditOrder = item.AuditOrder
+		auditorVM.AccountGroup = item.AccountGroup
+		auditorVM.Progress = item.Progress
+		auditorVM.Company = item.Company
+		auditorVM.Status = item.Status
+		encryptAuditors = append(encryptAuditors, auditorVM)
+	}
+	auditHistory := s.daoQualityAudit.GetAuditHistory(qualityData.Id, qualityData.Times)
+	data.AuditHistory = auditHistory
+	// 整改单
+	rectifiedInfo, _ := s.daoQualityAudit.GetLastedOrder(qualityData.Id)
+	data.RectifiedInfo = rectifiedInfo
+
+	// 最新审批人信息
+	latestAuditor := s.daoApprover.GetLastedAuditor(qualityData.BidsectionId, 1, qualityData.Id)
+	data.LatestdAuditor = latestAuditor
+	data.Auditors = encryptAuditors
+
+	return data
+}
+
+// 安全概况
+func (s *qualityService) GetSurvey(projectId int, bidsectionId int) map[string]interface{} {
+	// 1.获得安全巡检
+	year := time.Now().Year()
+	qualityList := s.daoQuality.GetTypeYear(bidsectionId, year)
+	// 2.初始化
+	rectifylist := make([]models.CmQuality, 0)
+	rectifyTotal := 0
+	approvalTotal := 0
+	rectifyedTotal := 0
+	// 3.当年数据初始化
+	submitData := map[string]float64{
+		fmt.Sprintf("%d-01", year): 0,
+		fmt.Sprintf("%d-02", year): 0,
+		fmt.Sprintf("%d-03", year): 0,
+		fmt.Sprintf("%d-04", year): 0,
+		fmt.Sprintf("%d-05", year): 0,
+		fmt.Sprintf("%d-06", year): 0,
+		fmt.Sprintf("%d-07", year): 0,
+		fmt.Sprintf("%d-08", year): 0,
+		fmt.Sprintf("%d-09", year): 0,
+		fmt.Sprintf("%d-10", year): 0,
+		fmt.Sprintf("%d-11", year): 0,
+		fmt.Sprintf("%d-12", year): 0,
+	}
+	rectifyedData := submitData
+	for _, item := range qualityList {
+		if item.Status == 2 {
+			rectifylist = append(rectifylist, item)
+			rectifyTotal++
+		}
+		if item.Status == 1 {
+			approvalTotal++
+		}
+		if item.Status == 4 {
+			rectifyedTotal++
+		}
+
+		if item.Status == 0 {
+			submitData[item.CreateTime.Format(conf.SysTimeformMonth)] = submitData[item.CreateTime.Format(conf.SysTimeformMonth)] + 1
+		}
+		if item.Status == 4 {
+			rectifyedData[item.CreateTime.Format(conf.SysTimeformMonth)] = rectifyedData[item.CreateTime.Format(conf.SysTimeformMonth)] + 1
+		}
+	}
+
+	// 整改占总数比例 - 完成整改/提交巡检
+	surveryData := map[string]interface{}{
+		"rectifylist":    rectifylist,
+		"rectifyTotal":   rectifyTotal,
+		"approvalTotal":  approvalTotal,
+		"rectifyedTotal": rectifyedTotal,
+		"submitData":     submitData,
+		"rectifyedData":  rectifyedData,
+	}
+
+	return surveryData
+}
+
+// 规则校验
+func (s *qualityService) ValidRule(ctx iris.Context) (viewmodels.Quality, error) {
+	qualityVaild := viewmodels.Quality{}
+	// fmt.Println("---------------------------safeVaild", safeVaild)
+	if ctx.Method() == "GET" {
+		err := ctx.ReadForm(&qualityVaild)
+		if err != nil {
+			log.Println("safe-ValidRule-ReadForm转换异常, error=", err)
+			return qualityVaild, err
+		}
+		if ctx.Path() == s.validDetail {
+			// 一样要传id,所以用delete的方法判断
+			err = qualityVaild.ValidateQualityDelete()
+		} else {
+			err = qualityVaild.ValidateQualityList()
+		}
+		return qualityVaild, err
+	}
+
+	if ctx.Method() == "POST" {
+		err := ctx.ReadJSON(&qualityVaild)
+		if err != nil {
+			log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
+			return qualityVaild, err
+		}
+		err = qualityVaild.ValidateQualityCreate()
+		return qualityVaild, err
+		// if ctx.Path() == s.validCreate {
+		// }
+		// if ctx.Path() == s.validFile {
+		// 	err = safeVaild.ValidateFile()
+		// 	return safeVaild, err
+		// }
+	}
+
+	if ctx.Method() == "PUT" {
+		err := ctx.ReadForm(&qualityVaild)
+		if err != nil {
+			log.Println("safe-ValidRule-ReadForm转换异常, error=", err)
+			return qualityVaild, err
+		}
+		err = qualityVaild.ValidateQualityDelete()
+		return qualityVaild, err
+	}
+	return qualityVaild, nil
+
+}

+ 2 - 2
services/safe_service.go

@@ -170,7 +170,7 @@ func (s *safeService) GetDetail(id int, pid int) viewmodels.SafeDetail {
 func (s *safeService) GetSurvey(projectId int, bidsectionId int) map[string]interface{} {
 	// 1.获得安全巡检
 	year := time.Now().Year()
-	safelist := s.daoSafe.GetTypeYear(bidsectionId, year)
+	safeList := s.daoSafe.GetTypeYear(bidsectionId, year)
 	// 2.初始化
 	rectifylist := make([]models.CmSafe, 0)
 	rectifyTotal := 0
@@ -192,7 +192,7 @@ func (s *safeService) GetSurvey(projectId int, bidsectionId int) map[string]inte
 		fmt.Sprintf("%d-12", year): 0,
 	}
 	rectifyedData := submitData
-	for _, item := range safelist {
+	for _, item := range safeList {
 		if item.Status == 2 {
 			rectifylist = append(rectifylist, item)
 			rectifyTotal++

+ 239 - 0
web/api/quality_api.go

@@ -0,0 +1,239 @@
+/*
+ * @description: rpc - 质量巡检
+ * @Author: LanJianRong
+ * @Date: 2020-11-18
+ * @FilePath: \construction_management\web\api\quality_api.go
+ */
+
+package api
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/conf"
+	"go.mod/models"
+	"go.mod/services"
+	"go.mod/web/utils"
+)
+
+type QualityApi struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	ServiceQuality services.QualityService
+}
+
+// @Summary 质量巡检列表
+// @Tags 质量巡检
+// @Description 获得列表数据
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Param   pageNo     path    int     true        "页码" eg:1
+// @Param   pageSize     path    int     true        "页数" eg:15
+// @Success 200 {object} viewmodels.Quality "{code:0成功,data:viewmodels.Quality,msg:}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality [get]
+func (c *QualityApi) Get() {
+	// 1.规则验证
+	qualityData, err := c.ServiceQuality.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	pid, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "项目id不存在, 请重新登录"})
+		return
+	}
+	bidsectionId, err := utils.GetDecryptId(qualityData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	QualityData, total := c.ServiceQuality.Get(bidsectionId, pid, qualityData.PageNo, qualityData.PageSize)
+
+	c.Ctx.JSON(iris.Map{
+		"code":  0,
+		"msg":   "请求成功",
+		"data":  QualityData,
+		"total": total,
+	})
+}
+
+// @Summary 创建新的质量巡检记录
+// @Tags 质量巡检
+// @Description 创建新的质量巡检记录
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     body    string     true        "标段ID"
+// @Param   code     					body    string     true        "编号"
+// @Param   createTime     body    string     true        "日期"
+// @Param   inspection     body    string     true        "检查部位"
+// @Param   position     body    string     true        "部位"
+// @Success 200 {object} viewmodels.Quality "{code:0成功,msg:}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality [post]
+func (c *QualityApi) Post() {
+	// 1.规则验证
+	qualityData, err := c.ServiceQuality.ValidRule(c.Ctx)
+	// fmt.Println("-------------------------------", err)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	bidsectionId, err := utils.GetDecryptId(qualityData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	data := models.CmQuality{}
+	data.BidsectionId = bidsectionId
+	data.Code = qualityData.Code
+	data.Inspection = qualityData.Inspection
+	data.Times = 1
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "未登录或账号失效,请重新登录"})
+		return
+	}
+	data.Uid = uid
+	createTime, err := time.Parse(conf.SysTimeform, qualityData.CreateTime)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "日期转换异常,请检查参数"})
+		return
+	}
+	// fmt.Println(createTime)
+	data.CreateTime = createTime
+	err = c.ServiceQuality.Post(data)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{
+			"code": -1,
+			"msg":  fmt.Sprintf("%s", err),
+		})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "插入成功",
+	})
+}
+
+// @Summary 删除记录
+// @Tags 质量巡检
+// @Description 删除质量巡检记录
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "质量巡检ID"
+// @Success 200 {object} viewmodels.Quality "{code:0成功,msg:}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality [delete]
+func (c *QualityApi) Delete() {
+	queryId := c.Ctx.URLParam("id")
+	if queryId == "" {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "id不存在"})
+		return
+	}
+	id, err := utils.GetDecryptId(queryId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+
+	err = c.ServiceQuality.Del(id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{
+			"code": -1,
+			"msg":  fmt.Sprintf("%s", err),
+		})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "删除成功",
+	})
+}
+
+// @Summary 获取质量巡检详情
+// @Tags 质量巡检
+// @Description 获得质量巡检详情页面数据
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     path    string     true        "巡检ID"
+// @Success 200 {object} viewmodels.QualityDetail "{code:0成功,data:viewmodels.QualityDetail,msg:}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality/detail [get]
+func (c *QualityApi) GetDetail() {
+	// 1.规则验证
+	qualityData, err := c.ServiceQuality.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	id, err := utils.GetDecryptId(qualityData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadForm转换异常,请检查参数"})
+		return
+	}
+	pid, _ := utils.GetProjectId(c.Ctx)
+	quality := c.ServiceQuality.GetDetail(id, pid)
+
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "请求成功",
+		"data": quality,
+	})
+}
+
+// @Summary 质量概述
+// @Tags 质量巡检
+// @Description 质量概述
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,msg:错误信息}"
+// @Router /api/quality/survey [get]
+func (c *QualityApi) GetSurvey() {
+	// sectionData := viewmodels.Quality{}
+	// err := c.Ctx.ReadForm(&sectionData)
+	// if err != nil {
+	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+	// 	return
+	// }
+	// err = sectionData.ValidateBidsectionId()
+	// if err != nil {
+	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+	// 	return
+	// }
+
+	// 标段ID
+	// bidsectionId, err := utils.GetDecryptId(sectionData.BidsectionId)
+	// if err != nil {
+	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+	// 	return
+	// }
+
+	// 项目ID
+	// projectId, err := utils.GetProjectId(c.Ctx)
+	// if err != nil {
+	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+	// 	return
+	// }
+
+	// QualityData := c.ServiceQuality.GetSurvey(projectId, bidsectionId)
+
+	// c.Ctx.JSON(iris.Map{
+	// 	"code":     0,
+	// 	"msg":      "",
+	// 	"data": QualityData,
+	// })
+
+}

+ 257 - 0
web/api/quality_audit_api.go

@@ -0,0 +1,257 @@
+/*
+ * @description: 质量巡检审批相关
+ * @Author: LanJianRong
+ * @Date: 2020-12-18
+ * @FilePath: \construction_management\web\api\quality_audit_api.go
+ */
+
+package api
+
+import (
+	"fmt"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/services"
+	"go.mod/web/utils"
+)
+
+type QualityAuditApi struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	QualityAuditService services.QualityAuditService
+}
+
+// @Summary 开始审批
+// @Tags 安全巡检-审批
+// @Description 开始审批
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   quality_id     body    string     true        "安全巡检id"
+// @Param   bidsection_id     body    string     true        "标段id"
+// @Param   auditors     body    array     true        "审核组"
+// @Param   reAuditors     body    array     true        "复查组"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality_audit/start [post]
+func (c *QualityAuditApi) PostStart() {
+	// 1.规则验证
+	qualityAuditData, err := c.QualityAuditService.ValidStart(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 2.获取bid
+	bidsectionId, err := utils.GetDecryptId(qualityAuditData.BidsectionId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 3.获取qualityId
+	qualityId, err := utils.GetDecryptId(qualityAuditData.QualityId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 4.解析审批组id、复查组id
+	var auditors []int
+	for _, item := range qualityAuditData.Auditors {
+		auditId, _ := utils.GetDecryptId(item)
+		auditors = append(auditors, auditId)
+	}
+	var reAuditors []int
+	for _, item := range qualityAuditData.ReAuditors {
+		auditId, _ := utils.GetDecryptId(item)
+		reAuditors = append(reAuditors, auditId)
+	}
+	// 5.获取当前用户id
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 6.获取当前项目id
+	pid, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 7.执行sql
+	err = c.QualityAuditService.StartAudit(qualityId, bidsectionId, auditors, reAuditors, uid, pid)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "插入成功",
+	})
+}
+
+// @Summary 关闭审批流程
+// @Tags 安全巡检-审批
+// @Description 直接停止审批流程
+// @Accept  json
+// @Produce  json
+// @Param   id     body    string     true        "审批流程id"
+// @Param   quality_id     body    string     true        "巡检id"
+// @Param   opinion     body    string     true        "审批意见"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality_audit/close [post]
+func (c *QualityAuditApi) PostClose() {
+	// 1.规则验证
+	qualityAuditData, err := c.QualityAuditService.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 2.获取审批记录id
+	id, err := utils.GetDecryptId(qualityAuditData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 3.获取安全巡检记录id
+	qualityId, err := utils.GetDecryptId(qualityAuditData.QualityId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 4.解析登录id
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 5. 执行sql
+	err = c.QualityAuditService.CloseAudit(id, qualityAuditData.Opinion, uid, qualityId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 6. 返回结果
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "请求成功",
+	})
+}
+
+// @Summary 审批退回
+// @Tags 安全巡检-审批
+// @Description
+// @Accept  json
+// @Produce  json
+// @Param   id     body    string     true        "审批id"
+// @Param   quality_id     body    string     true        "巡检id"
+// @Param   audit_id     body    string     false        "回滚的审批流程id, 不传则退回到上报人"
+// @Param   opinion     body    string     true        "审批意见"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality_audit/back [post]
+func (c *QualityAuditApi) PostBack() {
+	// 1.规则验证
+	qualityAuditData, err := c.QualityAuditService.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 2.获取当前审批流程id
+	id, err := utils.GetDecryptId(qualityAuditData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 3.解析登录id
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 4.获取安全巡检记录id、回滚的审批流程id
+	qualityId, err := utils.GetDecryptId(qualityAuditData.QualityId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	// 说明退回到了检查人
+	if qualityAuditData.AuditId == "" {
+		err = c.QualityAuditService.BackAudit(id, qualityAuditData.Opinion, uid, qualityId, 0)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+			return
+		}
+	} else {
+		auditId, err := utils.GetDecryptId(qualityAuditData.AuditId)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+			return
+		}
+		err = c.QualityAuditService.BackAudit(id, qualityAuditData.Opinion, uid, qualityId, auditId)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+			return
+		}
+	}
+
+	// 6. 返回结果
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "请求成功",
+	})
+}
+
+// @Summary 审批通过
+// @Tags 安全巡检-审批
+// @Description
+// @Accept  json
+// @Produce  json
+// @Param   id     			body    string		true		"审批id"
+// @Param   quality_id     body    string		true		"巡检id"
+// @Param   audit_id    body    string		false		"整改人id"
+// @Param 	opinion			body 		string		false		"审批意见"
+// @Param   rectifiedInfo body string false "整改情况"
+// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Failure 400 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Router /api/quality_audit/pass [post]
+func (c *QualityAuditApi) PostPass() {
+	// 1.规则验证
+	qualityAuditData, err := c.QualityAuditService.ValidRule(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 2.获取审批记录id
+	id, err := utils.GetDecryptId(qualityAuditData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadJSON转换异常,请检查参数"})
+		return
+	}
+	var auditId = 0
+	if qualityAuditData.AuditId != "" {
+		aid, err := utils.GetDecryptId(qualityAuditData.AuditId)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": "解析参数,请检查参数"})
+			return
+		}
+		auditId = aid
+	}
+	// 3.解析登录id
+	uid, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 4. 执行sql
+	err = c.QualityAuditService.PassAudit(id, uid, auditId, qualityAuditData.Opinion, qualityAuditData.RectifiedInfo)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 6. 返回结果
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "请求成功",
+	})
+}

+ 3 - 3
web/api/safe_api.go

@@ -233,9 +233,9 @@ func (c *SafeApi) GetSurvey() {
 	SafeData := c.ServiceSafe.GetSurvey(projectId, bidsectionId)
 
 	c.Ctx.JSON(iris.Map{
-		"code":     0,
-		"msg":      "",
-		"SafeData": SafeData,
+		"code": 0,
+		"msg":  "",
+		"data": SafeData,
 	})
 
 }

+ 15 - 0
web/routes/routes.go

@@ -29,6 +29,8 @@ func Configure(b *bootstrap.Bootstrapper) {
 	RuleService := services.NewRuleService()
 	AnnexService := services.NewAnnexService()
 	SafeAuditService := services.NewSafeAuditService()
+	QualityService := services.NewQualityService()
+	QualityAuditService := services.NewQualityAuditService()
 	//CSRF相关
 	b.Use(middleware.SetCsrf)
 
@@ -152,6 +154,19 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiSafeAudit.Router.Use(middleware.SessionsAuth)
 	apiSafeAudit.Router.Use(middleware.AccessAuth)
 	apiSafeAudit.Handle(new(api.SafeAuditApi))
+
+	// quality
+	apiQuality := mvc.New(b.Party("/api/quality"))
+	apiQuality.Register(QualityService)
+	apiQuality.Router.Use(middleware.SessionsAuth)
+	apiQuality.Router.Use(middleware.AccessAuth)
+	apiQuality.Handle(new(api.QualityApi))
+
+	apiQualityAudit := mvc.New(b.Party("/api/quality_audit"))
+	apiQualityAudit.Register(QualityAuditService)
+	apiQualityAudit.Router.Use(middleware.SessionsAuth)
+	apiQualityAudit.Router.Use(middleware.AccessAuth)
+	apiQualityAudit.Handle(new(api.QualityAuditApi))
 	// rule
 	apiRule := mvc.New(b.Party("/api/rule"))
 	apiRule.Register(RuleService)

+ 108 - 0
web/viewmodels/quality.go

@@ -0,0 +1,108 @@
+/*
+ * @description: 质量巡检
+ * @Author: LanJianRong
+ * @Date: 2020-11-18
+ * @FilePath: \construction_management\web\viewmodels\quality.go
+ */
+package viewmodels
+
+import (
+	"time"
+
+	validation "github.com/go-ozzo/ozzo-validation/v3"
+)
+
+type Quality struct {
+	Id           string `form:"id" json:"id" `
+	BidsectionId string `form:"bidsectionId" json:"bidsectionId"`
+
+	Uid              string `form:"uid" json:"uid" `
+	Code             string `form:"code" json:"code"`
+	CreateTime       string `form:"createTime" json:"createTime"`
+	EndTime          string `form:"endTime" json:"endTime"`
+	Position         string `form:"position" json:"position"`
+	Inspection       string `form:"inspection" json:"inspection"`
+	InspectionDetail string `form:"inspectionDetail" json:"inspectionDetail"`
+	Demand           string `form:"demand" json:"demand"`
+	Status           int    `form:"status" json:"status"`
+	PageNo           int    `form:"pageNo" json:"pageNo"`
+	PageSize         int    `form:"pageSize" json:"pageSize"`
+}
+type QualityList struct {
+	Id               string `form:"id" json:"id" `
+	Code             string `form:"code" json:"code"`
+	CreateTime       string `form:"createTime" json:"createTime"`
+	Position         string `form:"position" json:"position"`
+	Inspection       string `form:"inspection" json:"inspection"`
+	InspectionDetail string `form:"inspectionDetail" json:"inspectionDetail"`
+	Demand           string `form:"demand" json:"demand"`
+	Status           int    `form:"status" json:"status"`
+	AuditName        string `form:"auditName" json:"auditName"`
+	FileCounts       int64  `from:"fileCounts" json:"fileCounts"`
+}
+
+type QualityDetail struct {
+	Id           string `form:"id" json:"id" `
+	BidsectionId string `form:"bidsectionId" json:"bidsectionId"`
+
+	Uid              string                        `from:"uid" json:"uid"`
+	Code             string                        `form:"code" json:"code"`
+	CreateTime       time.Time                     `form:"createTime" json:"createTime"`
+	Position         string                        `form:"position" json:"position"`
+	Inspection       string                        `form:"inspection" json:"inspection"`
+	InspectionDetail string                        `form:"inspectionDetail" json:"inspectionDetail"`
+	Demand           string                        `form:"demand" json:"demand"`
+	Times            int                           `from:"times" json:"times"`
+	Status           int                           `form:"status" json:"status"`
+	AuditName        string                        `form:"auditName" json:"auditName"`
+	File             FileStruct                    `form:"file" json:"file"`
+	Auditors         []Auditors                    `form:"auditors" json:"auditors"`
+	AuditHistory     map[int][]HistoryQualityAudit `from:"auditHistory" json:"auditHistory"`
+	RectifiedInfo    []CheckOrderVM                `from:"rectifiedInfo" json:"rectifiedInfo"`
+	LatestdAuditor   *Approver                     `from:"latestAuditor" json:"latestAuditor"`
+}
+
+// 单独出一个struct方便分页使用
+
+type QualityFile struct {
+	FileName    string    `from:"filename" json:"filename"`
+	FilePath    string    `from:"filepath" json:"filepath"`
+	AccountName string    `from:"account_name" json:"acountName"`
+	AccountId   string    `from:"account_id" json:"acountId"`
+	CreateTime  time.Time `from:"create_time" json:"createTime"`
+}
+
+type QualityListAuditRecord struct {
+	Name       string `form:"name" json:"name"`
+	CreateTime string `form:"create_time" json:"create_time"`
+}
+
+func (l Quality) ValidateQualityList() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+		validation.Field(&l.PageNo, validation.Required.Error("页码不能为空")),
+		validation.Field(&l.PageSize, validation.Required.Error("页数不能为空")),
+	)
+}
+
+func (l Quality) ValidateQualityCreate() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+		validation.Field(&l.CreateTime, validation.Required.Error("日期不能为空")),
+		validation.Field(&l.Code, validation.Required.Error("编号不能为空")),
+		validation.Field(&l.Position, validation.Required.Error("检查部位不能为空")),
+		validation.Field(&l.Inspection, validation.Required.Error("检查项目不能为空")),
+	)
+}
+
+func (l Quality) ValidateQualityDelete() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("检查项目不能为空")),
+	)
+}
+
+func (l Quality) ValidateQualityBidsectionId() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+	)
+}

+ 85 - 0
web/viewmodels/quality_audit.go

@@ -0,0 +1,85 @@
+/*
+ * @description: 安全巡检-审批
+ * @Author: LanJianRong
+ * @Date: 2020-12-18
+ * @FilePath: \construction_management\web\viewmodels\quality_audit.go
+ */
+package viewmodels
+
+import (
+	"time"
+
+	validation "github.com/go-ozzo/ozzo-validation/v3"
+)
+
+type QualityAudit struct {
+	Id            string    `form:"id" json:"id"`
+	QualityId     string    `form:"quality_id" json:"quality_id"`
+	BidsectionId  string    `form:"bidsection_id" json:"bidsection_id"`
+	Times         int       `form:"times" json:"times"`
+	AuditId       string    `form:"audit_id" json:"audit_id"`
+	AuditOrder    int       `form:"audit_order" json:"audit_order"`
+	Status        int       `form:"status" json:"status"`
+	CreateTime    time.Time `form:"create_time" json:"create_time"`
+	EndTime       time.Time `form:"end_time" json:"end_time"`
+	Progress      string    `form:"progress" json:"progress"`
+	Opinion       string    `form:"opinion" json:"opinion"`
+	RectifiedInfo string    `form:"rectifiedInfo" json:"rectifiedInfo"`
+}
+
+type HistoryQualityAudit struct {
+	Id         string    `from:"id" json:"id"`
+	Name       string    `from:"name" json:"name"`
+	Position   string    `from:"position" json:"position"`
+	CreateTime time.Time `from:"create_time" json:"create_time"`
+	Opinion    string    `from:"opinion" json:"opinion"`
+	Status     int       `from:"status" json:"status"`
+	Progress   string    `from:"progress" json:"progress"`
+}
+
+func (l QualityAudit) ValidateQualityAddAuditor() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段ID不能为空")),
+		validation.Field(&l.QualityId, validation.Required.Error("巡检ID不能为空")),
+		validation.Field(&l.Times, validation.Required.Error("times不能为空")),
+		validation.Field(&l.AuditId, validation.Required.Error("审核人不能为空")),
+	)
+}
+
+func (l QualityAudit) ValidateQualityClose() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("记录id不能为空")),
+		validation.Field(&l.QualityId, validation.Required.Error("巡检id不能为空")),
+	)
+}
+
+func (l QualityAudit) ValidateQualityBack() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("记录id不能为空")),
+		validation.Field(&l.QualityId, validation.Required.Error("巡检id不能为空")),
+	)
+}
+func (l QualityAudit) ValidateQualityPass() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Id, validation.Required.Error("记录id不能为空")),
+		validation.Field(&l.QualityId, validation.Required.Error("巡检id不能为空")),
+	)
+}
+
+type QualityAuditStart struct {
+	QualityId    string   `form:"quality_id" json:"quality_id"`
+	BidsectionId string   `form:"bidsection_id" json:"bidsection_id"`
+	Times        int      `form:"times" json:"times"`
+	Auditors     []string `form:"auditors" json:"auditors"`
+	ReAuditors   []string `form:"reAuditors" json:"reAuditors"`
+}
+
+func (l QualityAuditStart) ValidateQualityStart() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.BidsectionId, validation.Required.Error("标段id不能为空")),
+		validation.Field(&l.QualityId, validation.Required.Error("巡检id不能为空")),
+		validation.Field(&l.Times, validation.Required.Error("审批次数不能为空")),
+		validation.Field(&l.Auditors, validation.Required.Error("审批组不能为空")),
+		validation.Field(&l.ReAuditors, validation.Required.Error("复查组不能为空")),
+	)
+}