Jelajahi Sumber

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_adminUI

ct 2 minggu lalu
induk
melakukan
b4e8eba756

+ 39 - 0
src/api/course/coursePlaySourceConfig.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+export function list(query) {
+  return request({
+    url: '/course/playSourceConfig/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function get(id) {
+  return request({
+    url: '/course/playSourceConfig/' + id,
+    method: 'get'
+  })
+}
+
+export function add(data) {
+  return request({
+    url: '/course/playSourceConfig',
+    method: 'post',
+    data: data
+  })
+}
+
+export function update(data) {
+  return request({
+    url: '/course/playSourceConfig',
+    method: 'put',
+    data: data
+  })
+}
+
+export function del(id) {
+  return request({
+    url: '/course/playSourceConfig/' + id,
+    method: 'delete'
+  })
+}

+ 27 - 0
src/api/his/inquiryPatient.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 新增患者问诊信息
+export function addinquiryPatient(data) {
+  return request({
+    url: '/his/inquiryPatientInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改患者问诊信息
+export function updateinquiryPatient(data) {
+  return request({
+    url: '/his/inquiryPatientInfo',
+    method: 'put',
+    data: data
+  })
+}
+
+//获取患者问诊信息详情
+export function detail(inquiryOrderId) {
+  return request({
+    url: '/his/inquiryPatientInfo/detail/'+ inquiryOrderId,
+    method: 'get'
+  })
+}

+ 49 - 0
src/api/saler/competitorInfo.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 竞品信息模块请求前缀
+const prefix = '/saler/competitorInfo'
+
+// 查询竞品信息列表
+export function listCompetitorInfo(query) {
+  return request({
+    url: prefix + '/listPage',
+    method: 'post',
+    data: query
+  })
+}
+
+// 查询竞品信息详细
+export function getCompetitorInfo(id) {
+  return request({
+    url: prefix + '/findById',
+    method: 'post',
+    data: { id }
+  })
+}
+
+// 新增竞品信息
+export function addCompetitorInfo(data) {
+  return request({
+    url: prefix + '/save',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改竞品信息
+export function updateCompetitorInfo(data) {
+  return request({
+    url: prefix + '/updateById',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除竞品信息
+export function delCompetitorInfo(id) {
+  return request({
+    url: prefix + '/deleteById',
+    method: 'post',
+    data: { id }
+  })
+}

+ 46 - 0
src/api/saler/productInfo.js

@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 查询商品列表
+export function listProductInfo(query) {
+  return request({
+    url: '/saler/serviceGoods/listPage',
+    method: 'post',
+    data: query
+  })
+}
+
+// 查询商品详细
+export function getProductInfo(id) {
+  return request({
+    url: '/saler/serviceGoods/findById',
+    method: 'post',
+    data: { id }
+  })
+}
+
+// 新增商品
+export function addProductInfo(data) {
+  return request({
+    url: '/saler/serviceGoods/save',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商品
+export function updateProductInfo(data) {
+  return request({
+    url: '/saler/serviceGoods/updateById',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除商品
+export function delProductInfo(id) {
+  return request({
+    url: '/saler/serviceGoods/deleteById',
+    method: 'post',
+    data: { id }
+  })
+}

+ 26 - 0
src/api/todo/todoItems.js

@@ -53,3 +53,29 @@ export function delTodoItems(id) {
     data: { id: id }
   })
 }
+
+// 分配执行者
+export function assignExecutor(data) {
+  return request({
+    url: '/todoItems/assignExecutor',
+    method: 'post',
+    data: data
+  })
+}
+
+// 获取可分配的执行者列表
+export function getExecutorList() {
+  return request({
+    url: '/todoItems/getExecutorList',
+    method: 'get'
+  })
+}
+
+// 获取执行人员列表(支持分页和公司名称搜索)
+export function getUserList(param) {
+  return request({
+    url: '/todoItems/getUserList',
+    method: 'post',
+    data: param
+  })
+}

+ 261 - 0
src/views/components/his/inquiryOrderDetails.vue

@@ -31,6 +31,9 @@
               <div class="operate-button-container" >
                  <el-button size="mini" @click="handledetails()" v-hasPermi="['his:inquiryOrderReport:query']">咨询报告</el-button>
               </div>
+              <div class="operate-button-container" >
+                 <el-button size="mini" @click="handlePatient()" v-hasPermi="['his:inquiryOrderReport:query']">患者诊断数据</el-button>
+              </div>
 
 
              </div>
@@ -93,6 +96,197 @@
              <el-button type="primary" @click="editStatusOpenOk">确 定</el-button>
            </span>
          </el-dialog>
+
+        <el-dialog
+        title="患者问诊数据"
+        :visible.sync="patientOpen"
+        width="1000px"
+        append-to-body>
+          <el-form ref="patientForm" :model="patientForm" label-width="110px" >
+
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="患者姓名" prop="patientName">
+                  <el-input disabled v-model="item.patientName"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="患者性别" prop="sex">
+                  <el-select disabled v-model="JSON.parse(item.patientJson).sex">
+                    <el-option label="男" :value = "1"></el-option>
+                    <el-option label="女" :value = "0"></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="患者年龄" prop="age">
+                  <el-input disabled v-model="JSON.parse(item.patientJson).age"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="患者电话" prop="mobile">
+                  <el-input disabled v-model="JSON.parse(item.patientJson).mobile"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="患者会员电话" prop="userPhone">
+                  <el-input disabled v-model="patientForm.userPhone"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="客户标签" prop="tag">
+                  <el-input  v-model="patientForm.tag"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="客服姓名" prop="companyUserName">
+                  <el-input disabled v-model="patientForm.companyUserName"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="课程档期" prop="courseName">
+                  <el-input  v-model="patientForm.courseName"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="预约医生" prop="doctorName">
+                  <el-input disabled v-model="item.doctorName"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="会诊时间" prop="subTime">
+                  <el-date-picker
+                  v-model="patientForm.subTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="就诊状态" prop="sex">
+                  <el-select  v-model="patientForm.diagnosisStatus">
+                    <el-option label="初诊" :value = "1"></el-option>
+                    <el-option label="复诊" :value = "2"></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="部门负责人" prop="deptManager">
+                  <el-input v-model="patientForm.deptManager"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <el-form-item label="患者病情主诉">
+              <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="patientForm.patientCondition">
+              </el-input>
+            </el-form-item>
+
+            <div class="contentx">
+              <div class="desct">
+                医生建议及处置
+              </div>
+            </div>
+            <el-form-item label="诊断">
+              <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="patientForm.doctorAdviceJson.diagnosis">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="饮食方面">
+              <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="patientForm.doctorAdviceJson.foodAdvice">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="运动方面">
+              <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="patientForm.doctorAdviceJson.sportAdvice">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="保健方面">
+              <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="patientForm.doctorAdviceJson.healthAdvice">
+              </el-input>
+            </el-form-item>
+
+            <el-form-item label="注意禁忌">
+              <el-input
+              type="textarea"
+              placeholder="请输入内容"
+              v-model="patientForm.taboo">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="客户需求">
+              <el-input  v-model="patientForm.customerRequire"></el-input>
+            </el-form-item>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="职业医师" prop="age">
+                  <el-input  v-model="patientForm.professionalDoctor"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="医生助理" prop="mobile">
+                  <el-input  v-model="patientForm.assistantDoctor"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <div class="contentx">
+              <div class="desct">
+                治疗方面
+              </div>
+              </div>
+            <div v-for="(i,index) in patientForm.doctorAdviceJson.treatmentAdvice" :key="index">
+              <el-row>
+                <el-col :span="8">
+                  <el-form-item label="诊断内容" prop="content">
+                    <el-input  v-model="i.content"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="建议治疗" prop="advice">
+                    <el-input  v-model="i.advice"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-button style="margin: 5px;" v-if="index+1 == patientForm.doctorAdviceJson.treatmentAdvice.length" @click="addItem(patientForm.doctorAdviceJson.treatmentAdvice.length)" type="primary" size="mini">+</el-button>
+                  <el-button style="margin: 5px;"  v-if="index !== 0" type="danger" size="mini" @click="delItem(i,index)">-</el-button>
+                </el-col>
+                
+              </el-row>
+            </div>
+          </el-form>
+          <span slot="footer" class="dialog-footer">
+             <el-button @click="patientOpen = false">取 消</el-button>
+             <el-button type="primary" @click="patientInquirySubmit">确 定</el-button>
+          </span>
+        </el-dialog>
  </div>
 
 <div class="contentx" v-if="item!=null">
@@ -259,6 +453,7 @@
 
 <script>
 import { msglist, sendMsg,listinquiryOrder,editStatus, logList,getinquiryOrder, delinquiryOrder, addinquiryOrder, updateinquiryOrder, exportinquiryOrder ,cancelOrder,refundOrder} from "@/api/his/inquiryOrder";
+import {addinquiryPatient, updateinquiryPatient, detail} from "@/api/his/inquiryPatient";
 import {getReportId} from "@/api/his/inquiryOrderReport";
 import msgDetails from '../../components/his/msgDetails.vue';
 import msgServiceDetails from '../../components/his/msgServiceDetails.vue';
@@ -273,6 +468,7 @@ import { js } from "js-beautify";
     components: { inquiryOrderReportDetails,msgDetails ,msgServiceDetails},
     data() {
       return {
+        patientOpen: false,
         logs:[],
         editStatusOpen:false,
         usageJson:{},
@@ -313,6 +509,21 @@ import { js } from "js-beautify";
         doctor:[],
         user:[],
         sexOptions: [],
+        patientForm: {
+          doctorAdviceJson: {
+            diagnosis: '',
+            foodAdvice: '',
+            sportAdvice: '',
+            healthAdvice: '',
+            treatmentAdvice: [
+              //默认一条
+              {
+                content: '',
+                advice: '',
+              }
+            ]
+          }
+        },
       }
     },
     created() {
@@ -340,6 +551,37 @@ import { js } from "js-beautify";
 
     },
     methods: {
+      addItem(length){
+        this.patientForm.doctorAdviceJson.treatmentAdvice.push({
+          content:'',
+          advice:'',
+        })
+        let ak = this.patientForm.doctorAdviceJson.treatmentAdvice.filter(obj => obj.content != '');
+      },
+      delItem(item,index){
+        this.patientForm.doctorAdviceJson.treatmentAdvice.splice(index,1)
+      },
+      handlePatient(){
+        this.patientOpen = true;
+        detail(this.item.orderId).then(res => {
+          this.patientForm = res.data;
+          if(!this.patientForm.doctorAdviceJson) {
+            this.patientForm.doctorAdviceJson = {
+              diagnosis: '',
+              foodAdvice: '',
+              sportAdvice: '',
+              healthAdvice: '',
+              treatmentAdvice: [
+                //默认一条
+                {
+                  content: '',
+                  advice: '',
+                }
+              ]
+            }
+          }
+        })
+      },
       cancelorder(){
         var that=this;
         this.$confirm('是否确认取消订单?', "警告", {
@@ -369,6 +611,25 @@ import { js } from "js-beautify";
           });
           });
       },
+      patientInquirySubmit(){
+        this.patientForm.patientId = this.item.patientId;
+        this.patientForm.companyUserId = this.item.companyUserId;
+        this.patientForm.userId = this.item.userId;
+        this.patientForm.inquiryOrderId = this.item.orderId;
+        this.patientForm.subDoctorId = this.item.doctorId;
+        console.log(this.patientForm);
+        if(this.patientForm.id != null) {
+          updateinquiryPatient(this.patientForm).then(res => {
+            this.msgSuccess("更新成功");
+            this.patientOpen = false;
+          })
+        } else {
+          addinquiryPatient(this.patientForm).then(res => {
+            this.msgSuccess("添加成功");
+            this.patientOpen = false;
+          })
+        }
+      },
       msgServiceDetailsClose(){
         this.msgServiceDetails.open = false;
       },

+ 324 - 0
src/views/course/coursePlaySourceConfig/index.vue

@@ -0,0 +1,324 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="appid" prop="appid">
+        <el-input
+          v-model="queryParams.appid"
+          placeholder="请输入appid"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['course:playSourceConfig:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['course:playSourceConfig:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['course:playSourceConfig:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="名称" align="center" prop="name" />
+      <el-table-column label="图标" align="center" prop="img">
+        <template slot-scope="scope">
+          <el-image
+            style="width: 80px; height: 80px"
+            :src="scope.row.img"
+            :preview-src-list="[scope.row.img]">
+          </el-image>
+        </template>
+      </el-table-column>
+      <el-table-column label="原始ID" align="center" prop="originalId" />
+      <el-table-column label="appId" align="center" prop="appid" />
+      <el-table-column label="secret" align="center" prop="secret" />
+      <el-table-column label="token" align="center" prop="token" />
+      <el-table-column label="aesKey" align="center" prop="aesKey" />
+      <el-table-column label="msgDataFormat" align="center" prop="msgDataFormat" />
+      <el-table-column label="类型" align="center" prop="type">
+        <template slot-scope="scope">
+          <dict-tag  :options="typesOptions" :value="scope.row.type"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="修改时间" align="center" prop="updateTime" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['course:playSourceConfig:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['course:playSourceConfig:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改点播配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="130px">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
+        </el-form-item>
+        <el-form-item label="图标" prop="img">
+          <image-upload v-model="form.img" :file-type='["png", "jpg", "jpeg"]' :limit="1"/>
+        </el-form-item>
+        <el-form-item label="类型" prop="type">
+          <el-select
+            v-model="form.type"
+            placeholder="请选择类型">
+            <el-option
+              v-for="item in typesOptions"
+              :key="item.dictValue"
+              :label="item.dictLabel"
+              :value="item.dictValue"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="原始id" prop="originalId">
+          <el-input v-model="form.originalId" placeholder="请输入原始id" />
+        </el-form-item>
+        <el-form-item label="appid" prop="appid">
+          <el-input v-model="form.appid" placeholder="请输入appid" />
+        </el-form-item>
+        <el-form-item label="secret" prop="secret">
+          <el-input v-model="form.secret" placeholder="请输入secret" />
+        </el-form-item>
+        <el-form-item label="token" prop="token">
+          <el-input v-model="form.token" placeholder="请输入token" />
+        </el-form-item>
+        <el-form-item label="aesKey" prop="aesKey">
+          <el-input v-model="form.aesKey" placeholder="请输入aesKey" />
+        </el-form-item>
+        <el-form-item label="msgDataFormat" prop="msgDataFormat">
+          <el-input v-model="form.msgDataFormat" placeholder="请输入msgDataFormat" />
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {list, get, update, add, del} from '@/api/course/coursePlaySourceConfig'
+
+export default {
+  name: 'CoursePlaySourceConfig',
+  data() {
+    return {
+      queryParams: {},
+      showSearch: true,
+      single: true,
+      multiple: true,
+      ids: [],
+      loading: false,
+      list: [],
+      total: 0,
+      typesOptions: [],
+      title: null,
+      open: false,
+      form: {},
+      rules: {
+        name: [
+          { required: true, message: "名称不能为空", trigger: "blur" }
+        ],
+        appid: [
+          { required: true, message: "appid不能为空", trigger: "blur" }
+        ],
+        secret: [
+          { required: true, message: "secret不能为空", trigger: "blur" }
+        ],
+        token: [
+          { required: true, message: "token不能为空", trigger: "blur" }
+        ],
+        aesKey: [
+          { required: true, message: "aesKey不能为空", trigger: "blur" }
+        ],
+        msgDataFormat: [
+          { required: true, message: "msgDataFormat不能为空", trigger: "blur" }
+        ]
+      }
+    }
+  },
+  created() {
+    this.getDicts("play_source_type").then(response => {
+      this.typesOptions = response.data.map(item =>  {
+        return {
+        ...item,
+        listClass: 'primary'}
+      })
+    });
+    this.getList();
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      list(this.queryParams).then(response => {
+        this.list = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.getList();
+    },
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = "添加点播配置"
+    },
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id || this.ids
+      get(id).then(response => {
+        this.form = {
+          ...response.data,
+          type: response.data.type.toString()
+        }
+        this.open = true
+        this.title = "修改点播配置"
+      })
+    },
+    handleDelete(row) {
+      const id = row.id || this.ids
+      this.$confirm('是否确认删除点播配置编号为"' + id + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return del(id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            update(this.form).then(response => {
+              const {code, msg} = response
+              if (code !== 200) {
+                this.msgError(msg)
+                return
+              }
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            add(this.form).then(response => {
+              const {code, msg} = response
+              if (code !== 200) {
+                this.msgError(msg)
+                return
+              }
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        appid: null,
+        secret: null,
+        img: null,
+        originalId: null,
+        token: null,
+        aesKey: null,
+        msgDataFormat: null,
+        type: '1'
+      }
+      this.resetForm("form");
+    }
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 272 - 0
src/views/saler/competitorInfo/index.vue

@@ -0,0 +1,272 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="竞品公司" prop="competitorCompany">
+        <el-input
+          v-model="queryParams.competitorCompany"
+          placeholder="请输入竞品公司"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="产品" prop="product">
+        <el-input
+          v-model="queryParams.product"
+          placeholder="请输入产品名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['saler:competitorInfo:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['saler:competitorInfo:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['saler:competitorInfo:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="competitorInfoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" v-if="false" />
+      <el-table-column label="竞品公司" align="center" prop="competitorCompany" :show-overflow-tooltip="true" />
+      <el-table-column label="产品" align="center" prop="product" :show-overflow-tooltip="true" />
+      <el-table-column label="价格" align="center" prop="price" />
+      <el-table-column label="服务" align="center" prop="service" :show-overflow-tooltip="true" />
+      <el-table-column label="免费服务次数" align="center" prop="freeServiceTimes" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['saler:competitorInfo:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['saler:competitorInfo:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改竞品信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="竞品公司" prop="competitorCompany">
+          <el-input v-model="form.competitorCompany" placeholder="请输入竞品公司" />
+        </el-form-item>
+        <el-form-item label="产品" prop="product">
+          <el-input v-model="form.product" placeholder="请输入产品" />
+        </el-form-item>
+        <el-form-item label="价格" prop="price">
+          <el-input-number v-model="form.price" :precision="2" :step="0.1" :min="0" placeholder="请输入价格" />
+        </el-form-item>
+        <el-form-item label="服务" prop="service">
+          <el-input v-model="form.service" type="textarea" placeholder="请输入服务内容" />
+        </el-form-item>
+        <el-form-item label="免费服务次数" prop="freeServiceTimes">
+          <el-input-number v-model="form.freeServiceTimes" :min="0" placeholder="请输入免费服务次数" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCompetitorInfo, getCompetitorInfo, addCompetitorInfo, updateCompetitorInfo, delCompetitorInfo } from "@/api/saler/competitorInfo";
+
+export default {
+  name: "CompetitorInfo",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 竞品信息表格数据
+      competitorInfoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        competitorCompany: null,
+        product: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        competitorCompany: [
+          { required: true, message: "竞品公司不能为空", trigger: "blur" }
+        ],
+        product: [
+          { required: true, message: "产品不能为空", trigger: "blur" }
+        ],
+        price: [
+          { required: true, message: "价格不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询竞品信息列表 */
+    getList() {
+      this.loading = true;
+      listCompetitorInfo(this.queryParams).then(response => {
+        this.competitorInfoList = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        competitorCompany: null,
+        product: null,
+        price: 0,
+        service: null,
+        freeServiceTimes: 0,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加竞品信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCompetitorInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改竞品信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCompetitorInfo(this.form).then(response => {
+              this.$message.success("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCompetitorInfo(this.form).then(response => {
+              this.$message.success("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除竞品信息编号为"' + ids + '"的数据项?').then(function() {
+        return delCompetitorInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$message.success("删除成功");
+      }).catch(() => {});
+    }
+  }
+};
+</script>

+ 296 - 0
src/views/saler/productInfo/index.vue

@@ -0,0 +1,296 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="商品名称" prop="productName">
+        <el-input
+          v-model="queryParams.productName"
+          placeholder="请输入商品名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="会员情况" prop="memberStatus">
+        <el-input
+          v-model="queryParams.memberStatus"
+          placeholder="请输入会员情况"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['saler:productInfo:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['saler:productInfo:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['saler:productInfo:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="productInfoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="商品ID" align="center" prop="id" />
+      <el-table-column label="商品名称" align="center" prop="productName" />
+      <el-table-column label="购买数量" align="center" prop="purchaseQuantity" />
+      <el-table-column label="金额" align="center" prop="amount" />
+      <el-table-column label="预计完成时间" align="center" prop="plannedCompletionDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.plannedCompletionDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="购买次数" align="center" prop="purchaseTimes" />
+      <el-table-column label="剩余次数" align="center" prop="surplusTimes" />
+      <el-table-column label="会员情况" align="center" prop="memberStatus" />
+      <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['saler:productInfo:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['saler:productInfo:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改商品对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="商品名称" prop="productName">
+          <el-input v-model="form.productName" placeholder="请输入商品名称" />
+        </el-form-item>
+        <el-form-item label="购买数量" prop="purchaseQuantity">
+          <el-input-number v-model="form.purchaseQuantity" :min="0" :max="9999" />
+        </el-form-item>
+        <el-form-item label="金额" prop="amount">
+          <el-input-number v-model="form.amount" :precision="2" :min="0" :step="0.01" />
+        </el-form-item>
+        <el-form-item label="预计完成时间" prop="plannedCompletionDate">
+          <el-date-picker clearable
+                          v-model="form.plannedCompletionDate"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="请选择预计完成时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="购买次数" prop="purchaseTimes">
+          <el-input-number v-model="form.purchaseTimes" :min="0" :max="9999" />
+        </el-form-item>
+        <el-form-item label="剩余次数" prop="surplusTimes">
+          <el-input-number v-model="form.surplusTimes" :min="0" :max="9999" />
+        </el-form-item>
+        <el-form-item label="会员情况" prop="memberStatus">
+          <el-input v-model="form.memberStatus" placeholder="请输入会员情况" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listProductInfo, getProductInfo, addProductInfo, updateProductInfo, delProductInfo } from "@/api/saler/productInfo";
+
+export default {
+  name: "ProductInfo",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品表格数据
+      productInfoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        productName: null,
+        memberStatus: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        productName: [
+          { required: true, message: "商品名称不能为空", trigger: "blur" }
+        ],
+        purchaseQuantity: [
+          { required: true, message: "购买数量不能为空", trigger: "blur" }
+        ],
+        amount: [
+          { required: true, message: "金额不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询商品列表 */
+    getList() {
+      this.loading = true;
+      listProductInfo(this.queryParams).then(response => {
+        this.productInfoList = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        productName: null,
+        purchaseQuantity: 0,
+        amount: 0,
+        plannedCompletionDate: null,
+        purchaseTimes: 0,
+        surplusTimes: 0,
+        memberStatus: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加商品";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids[0]
+      getProductInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改商品";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateProductInfo(this.form).then(response => {
+              this.$message.success("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProductInfo(this.form).then(response => {
+              this.$message.success("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除商品编号为"' + ids + '"的数据项?').then(function() {
+        return delProductInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$message.success("删除成功");
+      }).catch(() => {});
+    }
+  }
+};
+</script>

+ 249 - 20
src/views/todo/todoItems/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px" >
       <el-form-item label="标题" prop="title">
         <el-input
           v-model="queryParams.title"
@@ -9,6 +9,15 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="公司名称" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入公司名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
       <el-form-item label="状态" prop="status">
         <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
           <el-option
@@ -61,21 +70,29 @@
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="todoItemsList" @selection-change="handleSelectionChange">
+    <el-table
+      v-loading="loading"
+      :data="todoItemsList"
+      @selection-change="handleSelectionChange"
+    >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="ID" align="center" prop="id" />
       <el-table-column label="标题" align="center" prop="title" />
-      <el-table-column label="分配者" align="center" prop="title" />
-      <el-table-column label="执行人" align="center" prop="title" />
+      <el-table-column label="分配者" align="center" prop="creatorName" />
+      <el-table-column label="执行人" align="center" prop="assigneeName" />
       <el-table-column label="描述" align="center" prop="description" show-overflow-tooltip />
       <el-table-column label="状态" align="center" prop="status">
         <template slot-scope="scope">
-          <dict-tag :options="statusOptions" :value="scope.row.status"/>
+          <el-tag :type="getStatusType(scope.row.status)" size="small">
+            {{ getStatusLabel(scope.row.status) }}
+          </el-tag>
         </template>
       </el-table-column>
       <el-table-column label="优先级" align="center" prop="priority">
         <template slot-scope="scope">
-          <dict-tag :options="priorityOptions" :value="scope.row.priority"/>
+          <el-tag :type="getPriorityType(scope.row.priority)" size="small">
+            {{ getPriorityLabel(scope.row.priority) }}
+          </el-tag>
         </template>
       </el-table-column>
       <el-table-column label="截止时间" align="center" prop="dueDate" width="180">
@@ -88,7 +105,7 @@
           <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -97,13 +114,21 @@
             @click="handleUpdate(scope.row)"
             v-hasPermi="['todo:todoItems:edit']"
           >修改</el-button>
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-check"-->
+<!--            @click="handleUpdateStatus(scope.row)"-->
+<!--            v-hasPermi="['todo:todoItems:edit']"-->
+<!--          >更新状态</el-button>-->
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-check"
-            @click="handleUpdateStatus(scope.row)"
+            icon="el-icon-user"
+            @click="handleAssignExecutor(scope.row)"
             v-hasPermi="['todo:todoItems:edit']"
-          >更新状态</el-button>
+            class="assign-executor-btn"
+          >分配执行者</el-button>
           <el-button
             size="mini"
             type="text"
@@ -115,16 +140,18 @@
       </el-table-column>
     </el-table>
 
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <div class="pagination-wrapper">
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
 
     <!-- 添加或修改待办事项对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="标题" prop="title">
           <el-input v-model="form.title" placeholder="请输入待办事项标题" />
@@ -186,11 +213,37 @@
         <el-button @click="cancelStatus">取 消</el-button>
       </div>
     </el-dialog>
+
+    <!-- 分配执行者对话框 -->
+    <el-dialog title="分配执行者" :visible.sync="assignOpen" width="700px" append-to-body>
+      <el-form ref="assignForm" :model="assignForm" :rules="assignRules" label-width="80px">
+        <el-form-item label="待办事项" prop="title">
+          <el-input v-model="assignForm.title" disabled />
+        </el-form-item>
+        <el-form-item label="执行者" prop="executorId">
+          <el-select v-model="assignForm.executorId" placeholder="请选择执行者" filterable class="executor-select">
+            <el-option
+              v-for="executor in executorList"
+              :key="executor.userId"
+              :label="executor.userName"
+              :value="executor.userId"
+            ></el-option>
+          </el-select>
+          <div class="el-form-item__tip">
+            <small>执行者列表会根据搜索条件中的公司名称进行过滤</small>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitAssignForm">确 定</el-button>
+        <el-button @click="cancelAssign">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { listTodoItems, getTodoItems, delTodoItems, addTodoItems, updateTodoItems, updateTodoItemsStatus } from "@/api/todo/todoItems";
+import { listTodoItems, getTodoItems, delTodoItems, addTodoItems, updateTodoItems, updateTodoItemsStatus, assignExecutor, getExecutorList, getUserList } from "@/api/todo/todoItems";
 import {parseTime} from "../../../utils/common";
 
 export default {
@@ -217,16 +270,21 @@ export default {
       open: false,
       // 是否显示状态更新弹出层
       statusOpen: false,
+      // 是否显示分配执行者弹出层
+      assignOpen: false,
       // 状态选项
       statusOptions: [],
       // 优先级选项
       priorityOptions: [],
       todoItemTypeOptions: [],
+      // 执行者列表
+      executorList: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         title: null,
+        companyName: null,
         status: null
       },
       // 表单参数
@@ -235,6 +293,13 @@ export default {
       },
       // 状态表单参数
       statusForm: {},
+      // 分配执行者表单参数
+      assignForm: {
+        id: null,
+        title: '',
+        executorId: null,
+        remark: ''
+      },
       // 表单校验
       rules: {
         title: [
@@ -243,6 +308,12 @@ export default {
         status: [
           { required: true, message: "状态不能为空", trigger: "change" }
         ]
+      },
+      // 分配执行者表单校验
+      assignRules: {
+        executorId: [
+          { required: true, message: "请选择执行者", trigger: "change" }
+        ]
       }
     };
   },
@@ -257,6 +328,8 @@ export default {
     this.getDicts("todo_item_type").then(response => {
       this.todoItemTypeOptions = response.data;
     });
+    // 获取执行者列表
+    this.getExecutorList();
   },
   methods: {
     parseTime,
@@ -269,6 +342,51 @@ export default {
         this.loading = false;
       });
     },
+    /** 获取执行者列表 */
+    getExecutorList() {
+      const params = {
+        companyName: this.queryParams.companyName || '',
+        companyId: null,
+        pageNum: 1,
+        pageSize: 10 // 获取足够多的执行者供选择
+      };
+      getUserList(params).then(response => {
+        if (response.code === 200) {
+          this.executorList = response.data || [];
+        }
+      });
+    },
+    /** 获取状态标签 */
+    getStatusLabel(status) {
+      const statusOption = this.statusOptions.find(option => option.dictValue === String(status));
+      return statusOption ? statusOption.dictLabel : '未知';
+    },
+    /** 获取状态标签类型(颜色) */
+    getStatusType(status) {
+      const statusMap = {
+        '0': 'info',      // 待处理 - 蓝色
+        '1': 'warning',   // 进行中 - 橙色
+        '2': 'success',   // 已完成 - 绿色
+        '3': 'danger'     // 已取消 - 红色
+      };
+      return statusMap[String(status)] || 'info';
+    },
+    /** 获取优先级标签 */
+    getPriorityLabel(priority) {
+      const priorityOption = this.priorityOptions.find(option => option.dictValue === String(priority));
+      return priorityOption ? priorityOption.dictLabel : '未知';
+    },
+    /** 获取优先级标签类型(颜色) */
+    getPriorityType(priority) {
+      const priorityMap = {
+        '0': 'info',      // 低 - 蓝色
+        '1': 'success',   // 中 - 绿色
+        '2': 'warning',   // 高 - 橙色
+        '3': 'danger'     // 紧急 - 红色
+      };
+      return priorityMap[String(priority)] || 'info';
+    },
+
     // 取消按钮
     cancel() {
       this.open = false;
@@ -295,11 +413,15 @@ export default {
     handleQuery() {
       this.queryParams.pageNum = 1;
       this.getList();
+      // 更新执行者列表
+      this.getExecutorList();
     },
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
       this.handleQuery();
+      // 重置后更新执行者列表
+      this.getExecutorList();
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
@@ -317,7 +439,9 @@ export default {
     handleUpdate(row) {
       this.reset();
       const id = row.id || this.ids
-      getTodoItems(id).then(response => {
+      // 确保id是单个值,如果是数组则取第一个
+      const todoId = Array.isArray(id) ? id[0] : id;
+      getTodoItems(todoId).then(response => {
         this.form = response.data;
         // 确保数据类型匹配
         if (this.form.status !== null && this.form.status !== undefined) {
@@ -338,6 +462,16 @@ export default {
       };
       this.statusOpen = true;
     },
+    /** 分配执行者按钮操作 */
+    handleAssignExecutor(row) {
+      this.assignForm = {
+        id: row.id,
+        title: row.title,
+        executorId: row.executorId || null,
+        remark: ''
+      };
+      this.assignOpen = true;
+    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {
@@ -366,6 +500,28 @@ export default {
         this.getList();
       });
     },
+    /** 提交分配执行者 */
+    submitAssignForm() {
+      this.$refs["assignForm"].validate(valid => {
+        if (valid) {
+          assignExecutor(this.assignForm).then(response => {
+            this.$message.success("执行者分配成功");
+            this.assignOpen = false;
+            this.getList();
+          });
+        }
+      });
+    },
+    /** 取消分配执行者 */
+    cancelAssign() {
+      this.assignOpen = false;
+      this.assignForm = {
+        id: null,
+        title: '',
+        executorId: null,
+        remark: ''
+      };
+    },
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
@@ -384,7 +540,80 @@ export default {
 .mb8 {
   margin-bottom: 8px;
 }
+
 .fixed-width {
   width: 100px;
 }
+
+
+
+
+
+.assign-executor-btn {
+  margin-left: 5px;
+}
+
+.executor-select {
+  width: 100%;
+}
+
+.el-form-item__tip {
+  margin-top: 5px;
+  color: #909399;
+  font-size: 12px;
+}
+
+
+
+
+/* 标签样式优化 */
+.el-tag {
+  border-radius: 12px;
+  font-weight: 500;
+  padding: 4px 12px;
+  border: none;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+/* 分页样式 */
+.pagination-wrapper {
+  margin-top: 20px;
+}
+
+.el-pagination {
+  text-align: center;
+  padding: 20px;
+  background: #fff;
+  border-radius: 8px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+/* 对话框样式 */
+.el-dialog {
+  border-radius: 12px;
+  overflow: hidden;
+}
+
+.el-dialog__header {
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  color: white;
+  padding: 20px;
+}
+
+.el-dialog__title {
+  color: white;
+  font-weight: 600;
+}
+
+.el-dialog__body {
+  padding: 30px;
+}
+
+.el-dialog__footer {
+  padding: 20px;
+  border-top: 1px solid #ebeef5;
+  background: #f8f9fa;
+}
+
+
 </style>