zk 2 éve
szülő
commit
c0e0d4b5f8

+ 1 - 0
server/api/v1/autocode/enter.go

@@ -15,5 +15,6 @@ type ApiGroup struct {
 	PlaceProApi
 	UnitUserApi
 	UnitPlaceApi
+	AssignmentApi
 	// Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
 }

+ 1 - 1
server/api/v1/example/exa_file_upload_download.go

@@ -30,7 +30,7 @@ func (u *FileUploadAndDownloadApi) UploadFile(c *gin.Context) {
 		response.FailWithMessage("接收文件失败", c)
 		return
 	}
-	err, file = fileUploadAndDownloadService.UploadFile(header, noSave) // 文件上传后拿到文件路径
+	err, file = fileUploadAndDownloadService.UploadFile(header, noSave, c.Request.Form.Get("assignmentId")) // 文件上传后拿到文件路径
 	if err != nil {
 		global.GVA_LOG.Error("修改数据库链接失败!", zap.Any("err", err))
 		response.FailWithMessage("修改数据库链接失败", c)

+ 1 - 0
server/initialize/gorm.go

@@ -61,6 +61,7 @@ func MysqlTables(db *gorm.DB) {
 		autocode.PlacePro{},
 		autocode.UnitUser{},
 		autocode.UnitPlace{},
+		autocode.Assignment{},
 		// Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
 	)
 	if err != nil {

+ 1 - 0
server/initialize/router.go

@@ -82,6 +82,7 @@ func Routers() *gin.Engine {
 		autocodeRouter.InitPlaceProRouter(PrivateGroup)
 		autocodeRouter.InitUnitUserRouter(PrivateGroup)
 		autocodeRouter.InitUnitPlaceRouter(PrivateGroup)
+		autocodeRouter.InitAssignmentRouter(PrivateGroup)
 		// Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
 	}
 

+ 5 - 4
server/model/example/exa_file_upload_download.go

@@ -6,8 +6,9 @@ import (
 
 type ExaFileUploadAndDownload struct {
 	global.GVA_MODEL
-	Name string `json:"name" gorm:"comment:文件名"` // 文件名
-	Url  string `json:"url" gorm:"comment:文件地址"` // 文件地址
-	Tag  string `json:"tag" gorm:"comment:文件标签"` // 文件标签
-	Key  string `json:"key" gorm:"comment:编号"`   // 编号
+	Name         string `json:"name" gorm:"comment:文件名"`                               // 文件名
+	Url          string `json:"url" gorm:"comment:文件地址"`                               // 文件地址
+	Tag          string `json:"tag" gorm:"comment:文件标签"`                               // 文件标签
+	Key          string `json:"key" gorm:"comment:编号"`                                 // 编号
+	AssignmentId string `json:"assignmentId" gorm:"column:assignment_id;comment:任务编号"` // 任务编号
 }

+ 1 - 0
server/router/autocode/enter.go

@@ -15,5 +15,6 @@ type RouterGroup struct {
 	PlaceProRouter
 	UnitUserRouter
 	UnitPlaceRouter
+	AssignmentRouter
 	// Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
 }

+ 1 - 0
server/service/autocode/enter.go

@@ -15,5 +15,6 @@ type ServiceGroup struct {
 	PlaceProService
 	UnitUserService
 	UnitPlaceService
+	AssignmentService
 	// Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
 }

+ 25 - 6
server/service/example/exa_file_upload_download.go

@@ -66,13 +66,20 @@ func (e *FileUploadAndDownloadService) GetFileRecordInfoList(info request.PageIn
 	return err, fileLists, total
 }
 
+func (e *FileUploadAndDownloadService) GetFileRecordInfoByList(assignmentId uint) (err error, list []example.ExaFileUploadAndDownload) {
+	db := global.GVA_DB
+	var fileLists []example.ExaFileUploadAndDownload
+	err = db.Where("assignment_id=?", assignmentId).Order("updated_at desc").Find(&fileLists).Error
+	return err, fileLists
+}
+
 //@author: [piexlmax](https://github.com/piexlmax)
 //@function: UploadFile
 //@description: 根据配置文件判断是文件上传到本地或者七牛云
 //@param: header *multipart.FileHeader, noSave string
 //@return: err error, file model.ExaFileUploadAndDownload
 
-func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader, noSave string) (err error, file example.ExaFileUploadAndDownload) {
+func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader, noSave string, assignmentId string) (err error, file example.ExaFileUploadAndDownload) {
 	oss := upload.NewOss()
 	filePath, key, uploadErr := oss.UploadFile(header)
 	if uploadErr != nil {
@@ -80,12 +87,24 @@ func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader,
 	}
 	if noSave == "0" {
 		s := strings.Split(header.Filename, ".")
-		f := example.ExaFileUploadAndDownload{
-			Url:  filePath,
-			Name: header.Filename,
-			Tag:  s[len(s)-1],
-			Key:  key,
+		var f example.ExaFileUploadAndDownload
+		if assignmentId != "" {
+			f = example.ExaFileUploadAndDownload{
+				Url:          filePath,
+				Name:         header.Filename,
+				Tag:          s[len(s)-1],
+				Key:          key,
+				AssignmentId: assignmentId,
+			}
+		} else {
+			f = example.ExaFileUploadAndDownload{
+				Url:  filePath,
+				Name: header.Filename,
+				Tag:  s[len(s)-1],
+				Key:  key,
+			}
 		}
+
 		return e.Upload(f), f
 	}
 	return

+ 2 - 2
server/source/file.go

@@ -14,8 +14,8 @@ var File = new(file)
 type file struct{}
 
 var files = []example.ExaFileUploadAndDownload{
-	{global.GVA_MODEL{ID: 1, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "10.png", "http://qmplusimg.henrongyi.top/gvalogo.png", "png", "158787308910.png"},
-	{global.GVA_MODEL{ID: 2, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "logo.png", "http://qmplusimg.henrongyi.top/1576554439myAvatar.png", "png", "1587973709logo.png"},
+	{global.GVA_MODEL{ID: 1, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "10.png", "http://qmplusimg.henrongyi.top/gvalogo.png", "png", "158787308910.png", ""},
+	{global.GVA_MODEL{ID: 2, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "logo.png", "http://qmplusimg.henrongyi.top/1576554439myAvatar.png", "png", "1587973709logo.png", ""},
 }
 
 //@author: [SliverHorn](https://github.com/SliverHorn)

+ 97 - 0
web/src/api/assignment.js

@@ -0,0 +1,97 @@
+import service from '@/utils/request'
+
+// @Tags Assignment
+// @Summary 创建Assignment
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body model.Assignment true "创建Assignment"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
+// @Router /assignment/createAssignment [post]
+export const createAssignment = (data) => {
+  return service({
+    url: '/assignment/createAssignment',
+    method: 'post',
+    data
+  })
+}
+
+// @Tags Assignment
+// @Summary 删除Assignment
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body model.Assignment true "删除Assignment"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
+// @Router /assignment/deleteAssignment [delete]
+export const deleteAssignment = (data) => {
+  return service({
+    url: '/assignment/deleteAssignment',
+    method: 'delete',
+    data
+  })
+}
+
+// @Tags Assignment
+// @Summary 删除Assignment
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body request.IdsReq true "批量删除Assignment"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
+// @Router /assignment/deleteAssignment [delete]
+export const deleteAssignmentByIds = (data) => {
+  return service({
+    url: '/assignment/deleteAssignmentByIds',
+    method: 'delete',
+    data
+  })
+}
+
+// @Tags Assignment
+// @Summary 更新Assignment
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body model.Assignment true "更新Assignment"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
+// @Router /assignment/updateAssignment [put]
+export const updateAssignment = (data) => {
+  return service({
+    url: '/assignment/updateAssignment',
+    method: 'put',
+    data
+  })
+}
+
+// @Tags Assignment
+// @Summary 用id查询Assignment
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data query model.Assignment true "用id查询Assignment"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
+// @Router /assignment/findAssignment [get]
+export const findAssignment = (params) => {
+  return service({
+    url: '/assignment/findAssignment',
+    method: 'get',
+    params
+  })
+}
+
+// @Tags Assignment
+// @Summary 分页获取Assignment列表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data query request.PageInfo true "分页获取Assignment列表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
+// @Router /assignment/getAssignmentList [get]
+export const getAssignmentList = (params) => {
+  return service({
+    url: '/assignment/getAssignmentList',
+    method: 'get',
+    params
+  })
+}

+ 330 - 0
web/src/view/assignment/assignment.vue

@@ -0,0 +1,330 @@
+<template>
+  <div>
+    <div class="search-term">
+      <el-form :inline="true" :model="searchInfo" class="demo-form-inline">
+        <el-form-item>
+          <el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
+          <el-button size="mini" type="primary" icon="el-icon-plus" @click="openDialog">新增任务</el-button>
+          <el-popover v-model:visible="deleteVisible" placement="top" width="160">
+            <p>确定要删除吗?</p>
+            <div style="text-align: right; margin: 0">
+              <el-button size="mini" type="text" @click="deleteVisible = false">取消</el-button>
+              <el-button size="mini" type="primary" @click="onDelete">确定</el-button>
+            </div>
+            <template #reference>
+              <el-button icon="el-icon-delete" size="mini" type="danger" style="margin-left: 10px;">批量删除</el-button>
+            </template>
+          </el-popover>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-table
+      ref="multipleTable"
+      border
+      stripe
+      style="width: 100%"
+      tooltip-effect="dark"
+      :data="tableData"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="日期" width="180">
+        <template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
+      </el-table-column>
+      <el-table-column label="目标部门" prop="unitIds">
+        <template #default="scope">
+          <span v-for="item in scope.row.unitIds.split('|')">{{ unitMap[item]+"、" }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="标题" prop="title" />
+      <el-table-column label="内容" prop="text" />
+      <el-table-column label="按钮组">
+        <template #default="scope">
+          <el-button size="small" type="primary" class="table-button" @click="updateAssignment(scope.row)">任务详情</el-button>
+          <el-upload
+            :action="`${path}/fileUploadAndDownload/upload`"
+            :show-file-list="false"
+            :multiple="false"
+            :headers="{ 'x-token': token }"
+            :on-error="uploadError"
+            :on-success="uploadSuccess"
+            :data="{assignmentId:scope.row.ID}"
+            style="display:inline;padding: 0px 5px;"
+          >
+            <!--            :before-upload="checkFile"-->
+
+            <!--            :on-remove="delFile"-->
+            <el-button size="small" type="success" class="table-button">上传文件</el-button>
+          </el-upload>
+          <el-button type="danger" size="small" class="table-button" @click="deleteRow(scope.row)">删除</el-button>
+          <el-button size="small" type="warning" class="table-button" @click="updateAssignment(scope.row)">全部下载</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      layout="total, sizes, prev, pager, next, jumper"
+      :current-page="page"
+      :page-size="pageSize"
+      :page-sizes="[10, 30, 50, 100]"
+      :style="{float:'right',padding:'20px'}"
+      :total="total"
+      @current-change="handleCurrentChange"
+      @size-change="handleSizeChange"
+    />
+    <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" title="弹窗操作">
+      <el-form :model="formData" label-position="right" label-width="80px">
+        <el-form-item label="目标部门:">
+          <el-select
+            v-model="formData.unitId"
+            filterable
+            clearable
+            multiple
+            placeholder="请选择"
+          >
+            <el-option
+              v-for="id in Object.keys(unitMap)"
+              :key="id"
+              :label="unitMap[id]"
+              :value="id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="标题:">
+          <el-input v-model="formData.title" clearable placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="内容:">
+          <el-input v-model="formData.text" clearable placeholder="请输入" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeDialog">取 消</el-button>
+          <el-button type="primary" @click="enterDialog">确 定</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <el-dialog v-model="dialogFormVisibleInfo" :before-close="closeDialog">
+      <template #title>
+        任务详情
+        <div style="text-align: center;font-size: 18px;">
+          {{ formData.title }}
+        </div>
+
+      </template>
+      <el-divider />
+      责任单位
+      <div class="assignText">
+        <span v-for="item in formData.unitIds.split('|')" :key="item">{{ unitMap[item]+" | " }}</span>
+      </div>
+
+      <el-divider />
+      内容
+      <div class="assignText">
+        {{ formData.text }}
+      </div>
+      <el-divider />
+      <el-card v-if="formData.files.length>0" class="box-card">
+        <el-descriptions title="已上传附件" :column="4">
+          <el-descriptions-item v-for="file in formData.files" :key="file.ID">
+            <el-link :href="file.url" type="primary" target="_blank">{{ file.name.substring(0,file.name.lastIndexOf('.')) }}</el-link>
+          </el-descriptions-item>
+        </el-descriptions>
+      </el-card>
+      <div class="assignText">
+        <span v-if="formData.files.length<1">暂无上传文件</span>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createAssignment,
+  deleteAssignment,
+  deleteAssignmentByIds,
+  updateAssignment,
+  findAssignment,
+  getAssignmentList
+} from '@/api/assignment' //  此处请自行替换地址
+import infoList from '@/mixins/infoList'
+import { getUnitList } from '@/api/unit'
+import { mapGetters } from 'vuex'
+const path = import.meta.env.VITE_BASE_API
+export default {
+  name: 'Assignment',
+  mixins: [infoList],
+  data() {
+    return {
+      path: path,
+      listApi: getAssignmentList,
+      dialogFormVisible: false,
+      type: '',
+      deleteVisible: false,
+      dialogFormVisibleInfo: false,
+      multipleSelection: [],
+      unitMap: {},
+      formData: {
+        unitIds: '',
+        unitId: [],
+        title: '',
+        files: [],
+        text: '',
+      }
+    }
+  },
+  computed: {
+    ...mapGetters('user', ['token'])
+  },
+  async created() {
+    await this.getUnitList()
+    await this.getTableData()
+  },
+  methods: {
+  // 条件搜索前端看此方法
+    onSubmit() {
+      this.page = 1
+      this.pageSize = 10
+      this.getTableData()
+    },
+    getUnitList() {
+      const params = {
+        page: 1,
+        pageSize: 99999999,
+      }
+      getUnitList(params).then(res => {
+        if (res.code == 0) {
+          res.data.list.forEach((unit, index) => {
+            this.unitMap[unit.ID.toString()] = unit.unitName
+          })
+        }
+      })
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val
+    },
+    deleteRow(row) {
+      this.$confirm('确定要删除吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.deleteAssignment(row)
+      })
+    },
+    async onDelete() {
+      const ids = []
+      if (this.multipleSelection.length === 0) {
+        this.$message({
+          type: 'warning',
+          message: '请选择要删除的数据'
+        })
+        return
+      }
+      this.multipleSelection &&
+        this.multipleSelection.map(item => {
+          ids.push(item.ID)
+        })
+      const res = await deleteAssignmentByIds({ ids })
+      if (res.code === 0) {
+        this.$message({
+          type: 'success',
+          message: '删除成功'
+        })
+        if (this.tableData.length === ids.length && this.page > 1) {
+          this.page--
+        }
+        this.deleteVisible = false
+        this.getTableData()
+      }
+    },
+    async updateAssignment(row) {
+      const res = await findAssignment({ ID: row.ID })
+      this.type = 'update'
+      if (res.code === 0) {
+        this.formData = res.data.reassignment
+        this.formData.unitId = this.formData.unitIds.split('|')
+        this.dialogFormVisibleInfo = true
+      }
+    },
+    closeDialog() {
+      this.dialogFormVisible = false
+      this.dialogFormVisibleInfo = false
+      this.formData = {
+        unitIds: '',
+        title: '',
+        text: '',
+        files: [],
+      }
+    },
+    async deleteAssignment(row) {
+      const res = await deleteAssignment({ ID: row.ID })
+      if (res.code === 0) {
+        this.$message({
+          type: 'success',
+          message: '删除成功'
+        })
+        if (this.tableData.length === 1 && this.page > 1) {
+          this.page--
+        }
+        this.getTableData()
+      }
+    },
+    async enterDialog() {
+      let res
+      switch (this.type) {
+        case 'create':
+          this.formData.unitIds = this.formData.unitId.join('|')
+          res = await createAssignment(this.formData)
+          break
+        case 'update':
+          res = await updateAssignment(this.formData)
+          break
+        default:
+          res = await createAssignment(this.formData)
+          break
+      }
+      if (res.code === 0) {
+        this.$message({
+          type: 'success',
+          message: '创建/更改成功'
+        })
+        this.closeDialog()
+        this.getTableData()
+      }
+    },
+    uploadSuccess(res) {
+      this.fullscreenLoading = false
+      if (res.code === 0) {
+        this.$message({
+          type: 'success',
+          message: '上传成功'
+        })
+      } else {
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        })
+      }
+    },
+    uploadError() {
+      this.$message({
+        type: 'error',
+        message: '上传失败'
+      })
+      this.fullscreenLoading = false
+    },
+    openDialog() {
+      this.type = 'create'
+      this.dialogFormVisible = true
+    }
+  },
+}
+</script>
+
+<style scoped>
+.assignText{
+  padding-left: 80px;
+  padding-top: 30px;
+}
+</style>

+ 82 - 0
web/src/view/assignment/assignmentForm.vue

@@ -0,0 +1,82 @@
+<template>
+  <div>
+    <el-form :model="formData" label-position="right" label-width="80px">
+      <el-form-item label="目标部门:">
+        <el-input v-model="formData.unitIds" clearable placeholder="请输入" />
+      </el-form-item>
+      <el-form-item label="标题:">
+        <el-input v-model="formData.title" clearable placeholder="请输入" />
+      </el-form-item>
+      <el-form-item label="内容:">
+        <el-input v-model="formData.text" clearable placeholder="请输入" />
+      </el-form-item>
+      <el-form-item>
+        <el-button size="mini" type="primary" @click="save">保存</el-button>
+        <el-button size="mini" type="primary" @click="back">返回</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import {
+  createAssignment,
+  updateAssignment,
+  findAssignment
+} from '@/api/assignment' //  此处请自行替换地址
+import infoList from '@/mixins/infoList'
+export default {
+  name: 'Assignment',
+  mixins: [infoList],
+  data() {
+    return {
+      type: '',
+      formData: {
+        unitIds: '',
+        title: '',
+        text: '',
+      }
+    }
+  },
+  async created() {
+    // 建议通过url传参获取目标数据ID 调用 find方法进行查询数据操作 从而决定本页面是create还是update 以下为id作为url参数示例
+    if (this.$route.query.id) {
+      const res = await findAssignment({ ID: this.$route.query.id })
+      if (res.code === 0) {
+        this.formData = res.data.reassignment
+        this.type = 'update'
+      }
+    } else {
+      this.type = 'create'
+    }
+  },
+  methods: {
+    async save() {
+      let res
+      switch (this.type) {
+        case 'create':
+          res = await createAssignment(this.formData)
+          break
+        case 'update':
+          res = await updateAssignment(this.formData)
+          break
+        default:
+          res = await createAssignment(this.formData)
+          break
+      }
+      if (res.code === 0) {
+        this.$message({
+          type: 'success',
+          message: '创建/更改成功'
+        })
+      }
+    },
+    back() {
+      this.$router.go(-1)
+    }
+  }
+}
+</script>
+
+<style>
+</style>