zhangqiOMG 2 年 前
コミット
488efeb4b0

+ 2 - 1
src/App.vue

@@ -7,7 +7,8 @@
   import {mapGetters} from 'vuex'
   export default{
     data () {
-      return {}
+      return {
+      }
     },
     computed:{
     ...mapGetters({

+ 4 - 2
src/HManagement/task/modules/completeTask.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-button v-show="data.leader && data.leader[0] && nowUserid === data.leader[0].userid" class="inline-16" type="primary" size="mini" @click="dialogFormVisible = true" >完成任务</el-button>
+    <el-button v-show="data.leader && data.leader[0] && nowUserid === data.leader[0].userid" :disabled="data.status !== '进行中'" class="inline-16" type="primary" size="mini" @click="dialogFormVisible = true" >完成任务</el-button>
     <el-dialog title="完成任务" :visible.sync="dialogFormVisible" append-to-body width="500px">
       <el-form :model="form" label-position="top" label-width="90px">
         <el-form-item label="完成说明">
@@ -9,7 +9,7 @@
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="dialogFormVisible = false" size="small">取 消</el-button>
-        <el-button type="primary" @click="dialogFormVisible = false" size="small">确 定</el-button>
+        <el-button type="primary" @click="completeTask" size="small">确 定</el-button>
       </div>
     </el-dialog>
   </div>
@@ -37,6 +37,8 @@ export default {
         }
       })
       this.tool.showMessage(res,()=>{
+        this.dialogFormVisible = false
+        this.form.finishnotes = ''
         this.$emit('onSuccess')
       })
     }

+ 1 - 1
src/HManagement/task/modules/detail.vue

@@ -14,7 +14,7 @@
         @pageChange="pageChange"
         @onEditSuccess="queryMainData($route.query.id)">
       <div slot="customOperation" >
-        <complete-task :data="mainData" class="inline-16" @onSuccess="queryMainData()"></complete-task>
+        <complete-task :data="mainData" style="display:inline" @onSuccess="queryMainData()"></complete-task>
         <el-button class="inline-16" type="default" size="mini" @click="deleteTask">删 除</el-button>
       </div>
       <div slot="slot0" class="task__content">

+ 1 - 1
src/components/normal-basic-layout/details/index.vue

@@ -36,7 +36,7 @@
           <slot name="custom"></slot>
         </el-col>
         <el-col v-if="collapse" style="width:400px;" :span="6">
-          <!-- <taskTemp></taskTemp> -->
+          <taskTemp :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)"></taskTemp>
           <group v-if="activeApp.isdatateam" ref="group" style="margin-bottom:10px" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onSuccess="onSuccess">
             <el-button slot="collapse" type="text" icon="el-icon-s-unfold" class="inline-16" @click="onCollapse"></el-button>
           </group>

+ 123 - 24
src/components/normal-basic-layout/details/modules/task/addTask.vue

@@ -1,18 +1,25 @@
 <template>
   <div>
-    <el-button size="mini" type="text" @click="dialogTableVisible = true">
+    <el-button size="small" type="text" @click="dialogTableVisible = true">
         创建任务
     </el-button>
-    <el-dialog title="新增任务" append-to-body :visible.sync="dialogTableVisible" width="700px">
+    <el-dialog title="新增任务" append-to-body :visible.sync="dialogTableVisible" width="700px" :before-close="onCancel">
+			<el-alert
+				v-if="errormsg"
+				class="normal-margin"
+				:title="errormsg"
+				type="error">
+			</el-alert>
 			<el-input class="normal-margin" v-model="form.title" placeholder="输入任务标题" type="text" show-word-limit maxlength="40" size="small"></el-input>
-			<el-input  class="normal-margin" v-model="form.remarks" placeholder="输入任务内容" type="textarea" show-word-limit maxlength="100" size="small"></el-input>
+			<el-input  class="normal-margin" v-model="form.remarks" placeholder="输入任务内容" :autosize="{minRows:6}" type="textarea" show-word-limit maxlength="100" size="small"></el-input>
 			<div class="flex-align-center flex-between normal-margin">
 				<p class="task__label"><i class="el-icon-time"></i>&emsp;开始:</p>
 				<el-date-picker
 					v-model="form.starttime"
 					type="date"
 					placeholder="选择日期"
-					size="mini">
+					value-format="yyyy-MM-dd"
+					size="small">
 				</el-date-picker>
 				&emsp;- &emsp;
 				<p class="task__label">结束:</p>
@@ -20,14 +27,25 @@
 					v-model="form.endtime"
 					type="date"
 					placeholder="选择日期"
-					size="mini">
+					value-format="yyyy-MM-dd"
+					size="small">
 				</el-date-picker>
 			</div>
+			<div class="normal-margin flex-align-center">
+				<p class="task__label"><i class="el-icon-bell"></i>&emsp;提醒时间&emsp;</p>
+				<el-input :disabled="!form.endtime" v-model="form.remindday" size="small" style="width:90px"></el-input>
+				<p>&emsp;天</p>
+			</div>
 			<div class="normal-margin">
 				<p class="task__label"><i class="el-icon-upload2"></i>&emsp;上传附件</p>
-				<upload type="button"></upload>
+				<upload
+					ref="upload"
+					:folderid="folderid"
+					:bindData="bindData"
+					type="button">
+				</upload>
 			</div>
-			<div class="normal-margin">
+			<!-- <div class="normal-margin">
 				<p class="mt-10 task__label">关联项目/客户</p>
 				<el-input placeholder="请输入内容" disabled v-model="input3" class="input-with-select" size="small">
 					<el-select v-model="form.nat" slot="prepend" style="width:100px" placeholder="请选择">
@@ -36,58 +54,139 @@
 						<el-option label="客户" value="3"></el-option>
 					</el-select>
 				</el-input>
-			</div>
+			</div> -->
 			<div>
 				<p class="mt-10 task__label">执行人员</p>
 				<div class="flex-align-center flex-between">
-					<el-input placeholder="请输入内容" v-model="input3" class="input-with-select" size="small">
-						<p slot="prepend">主 办</p>
-					</el-input>
-					&emsp;
+					<el-popover
+						placement="right"
+						trigger="manual"
+						width="400"
+						v-model="visible">
+						<member ref="member" :param="param" :radio="true" @onSelect="setLeader" @onCancel="onCancel" source="task"></member>
+						<el-input placeholder="请输入内容" readonly v-model="leader.name" class="input-with-select" size="small" slot="reference" @focus="showMenber">
+							<p slot="prepend">主 办</p>
+						</el-input>
+					</el-popover>
+					
+					<!-- &emsp;
 					<el-input placeholder="请输入内容" v-model="input3" class="input-with-select" size="small">
 						<p slot="prepend">协 办</p>
-					</el-input>
+					</el-input> -->
 				</div>
 			</div>
 			<div slot="footer" class="dialog-footer">
         <el-button size="small" style="width:120px" @click="dialogTableVisible = false">取 消</el-button>
-        <el-button type="warning" size="small" style="width:120px" @click="submit">创 建</el-button>
+        <el-button type="warning" size="small" style="width:120px" @click="validateInput">创 建</el-button>
       </div>
     </el-dialog>
   </div>
 </template>
 <script>
+import member from './groupMenber.vue'
+
 import upload from '@/components/upload/preview_upload.vue';
 export default {
 	props:['ownertable'],
 	components:{
-		upload
+		upload,
+		member
 	},
 	data () {
 		return {
+			visible:false,
 			dialogTableVisible:false,
+			folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
 			form:{
 				"sys_taskid":0,
-        "title":"任务标题",
-        "remarks":"任务说明",
+        "title":"",
+        "remarks":"",
         "starttime":"",
-        "remindday":1,
-        "ownertable":"归属表",
-        "ownerid":0,
+        "remindday":0,
+        "ownertable":"",
+        "ownerid":this.$route.query.id,
         "endtime":"",
-				"nat":'1'
+				"leaderuserid":""
 			},
-			input3:''
+			// 查询可选择人员参数
+			param:{
+        "id": 20220930103501,
+        "content": {
+          "ownertable":this.ownertable,
+          "ownerid":this.$route.query.id,
+					"where":{
+						condition:''
+					}
+        }
+      },
+			errormsg:'',
+			bindData:{},
+			leader:{}
 		}
 	},
 	methods:{
-		submit () {}
+		validateInput () {
+			if (!this.form.title) {
+				this.errormsg = '请输入标题'
+				return false
+			} else if (!this.form.starttime) {
+				this.errormsg = '请选择开始日期'
+				return false
+			} else {
+				this.submit()
+			}
+		},
+		setLeader (val) {
+			this.leader = val[0]
+			this.form.leaderuserid = val[0].userid
+			this.visible = false
+		},
+		async submit () {
+			this.form.ownertable = this.ownertable
+			const res = await this.$api.requested({
+        "id": 20221211112101,
+        "content":this.form
+      })
+      this.tool.showMessage(res,()=>{
+				this.param.content.ownerid = res.data.sys_taskid
+        this.bindData = {
+          "ownertable": 'sys_task',
+          "ownerid": res.data.sys_taskid,
+          "usetype": 'default',
+        }
+        this.$refs['upload'].toUpload()
+        this.$emit('onSuccess')
+				this.dialogTableVisible = false
+				this.refresh()
+				this.errormsg = ''
+      })
+		},
+		refresh () {
+			this.form = {
+				"sys_taskid":0,
+        "title":"任务标题",
+        "remarks":"任务说明",
+        "starttime":"",
+        "remindday":0,
+        "ownertable":"",
+        "ownerid":this.$route.query.id,
+        "endtime":""
+			}
+		},
+		showMenber () {
+			this.visible = true
+			// this.validateInput()
+		},
+		onCancel (done) {
+			this.visible = false
+			done?done():""
+		}
 	}
 }
 
 </script>
 <style scoped>
 .task__label{
-	color:rgb(173, 172, 172)
+	color:rgb(173, 172, 172);
 }
 </style>

+ 176 - 0
src/components/normal-basic-layout/details/modules/task/groupMenber.vue

@@ -0,0 +1,176 @@
+<template>
+<div>
+	<!-- <el-input class="normal-margin" type="text" v-model="search" @keyup.native.enter="listData" suffix-icon="el-icon-search" size="small" placeholder="输入成员名称">
+    <div slot="prepend">
+      <el-tag type="info" size="mini" closable v-for="item in selected" :key="item.index">{{item.name}}</el-tag>
+    </div>
+  </el-input> -->
+  <div class="search_input normal-margin">
+    <div class="tag flex-align-center" type="primary" size="mini" closable v-for="item in selected" :key="item.index">
+      <div class="avatar-mini">
+        <img class="avatar__image" v-if="item.headpic" :src="item.headpic" alt="">
+        <p v-else>{{item.name.substr(0, 1)}}</p>
+      </div>
+      <p class="inline-16">{{item.name}}</p>
+      <b><i class="el-icon-close" @click="closeTag(item)"></i></b>
+    </div>
+    <input class="input_panel" type="text" v-model="search" @keyup.enter="listData" placeholder="输入搜索内容">
+  </div>
+	<div class="flex-align-stretch menber__panel">
+		<div class="flex-align-center menber__item flex-between" :class="showSelelctIcon(item)?'active_menber__item':''" style="flex:1 0 auto" v-for="item in tableData" :key="item.index" @click="clickMenber(item)">
+			<div  class="flex-align-center">
+				<div class="avatar inline-16">
+					<img class="avatar__image" v-if="item.headpic" :src="item.headpic" alt="">
+					<p v-else>{{item.name.substr(0, 1)}}</p>
+				</div>
+				<div>
+					<p>{{ item.name }} &nbsp;<small style="color:#999999ad">{{item.username}}</small></p>
+					<small style="color:#999999ad;margin-top:10px">部门:{{ item.depname?item.depname:"未知部门" }}&emsp;职位:{{ item.position?item.position:"未知部门" }}</small>
+				</div>
+			</div>
+			<i class="el-icon-check iconCheck" v-if="showSelelctIcon(item)"></i>
+		</div>
+	</div>
+  <el-empty v-if="tableData.length === 0" description="暂无数据" :image-size="40"></el-empty>
+  <el-button size="mini" style="margin-top:16px;float:right" @click="onCancel">取 消</el-button>
+	<el-button size="mini" type="primary" style="margin-top:16px;float:right;margin-right:10px" @click="onSelect">确 定</el-button>
+</div>
+</template>
+
+<script>
+export default {
+	props:['param','radio','checked'],
+  data () {
+    return {
+      search:'',
+      tableData: [],
+      total:0,
+      currentPage:0,
+			selected:[]
+    }
+  },
+  components:{
+  },
+  methods:{
+    async listData () {
+			this.param.content.where.condition = this.search
+      const res = await this.$api.requested(this.param)
+      this.tableData = res.data[0].team
+    },
+		clickMenber (item) {
+			if (this.radio) {
+				this.selected = []
+			}
+			let _isSame = this.selected.some(m=>item.userid === m.userid)
+			if (!_isSame) {
+				this.selected.push(item)
+			} else {
+				this.selected = this.selected.filter(e=>{
+					return e.userid !== item.userid
+				})
+			}
+		},
+		showSelelctIcon (item) {
+			let _isSame = this.selected.some(m=>item.userid === m.userid)
+			return _isSame
+		},
+		onSelect () {
+			this.$emit('onSelect',this.selected)
+		},
+    closeTag (item) {
+      this.selected = this.selected.filter(e=>{
+        return e.userid !== item.userid
+      })
+    },
+    onCancel () {
+      this.$emit('onCancel')
+    }
+  },
+  mounted () {
+    this.listData()
+  }
+}
+
+</script>
+<style>
+</style>
+<style scoped>
+.search_input{
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 8px 8px 0 8px;
+  border: 1px solid #f1f2f3;
+  border-radius: 5px;
+}
+.input_panel{
+  flex: 1;
+  min-width: 100px;
+  border:none;
+  outline: none;
+  margin-bottom: 8px;
+  color:#666
+}
+.menber__item{
+	width: calc(100% - 20px);
+	padding:5px 10px;
+	border-radius: 5px;
+	cursor: pointer;
+	color:#666;
+	margin-bottom: 5px;
+	transition: .2s linear;
+}
+.menber__item:hover{
+	background: #b5e4ff6e;
+}
+.active_menber__item{
+	background: #b5e4ff6e;
+}
+.menber__panel {
+	max-height: 300px;
+	overflow-y:scroll ;
+}
+.avatar{
+  position: relative;
+  height:30px;
+  width: 30px;
+  border-radius: 100%;
+  text-align: center;
+  line-height: 30px;
+  color:#fff;
+  font-weight: 500;
+  background: #3874F6;
+  cursor: pointer;
+  overflow: hidden;
+}
+.avatar__image{
+  height: 100%;
+  width: 100%;
+}
+.avatar-mini{
+  position: relative;
+  height:20px;
+  width: 20px;
+  line-height: 20px;
+  text-align: center;
+  margin-right: 5px;
+  color:#fff;
+  font-size: 12px;
+  font-weight: 500;
+  border-radius: 100%;
+  background: #3874F6;
+}
+.iconCheck{
+	font-weight: bold;
+	color:#3874F6
+}
+.tag{
+  font-size: 12px;
+  color:#666;
+  padding: 5px;
+  border-radius: 3px;
+  margin:0 5px 8px 0;
+  background: #b5e4ff6e;
+  cursor: pointer;
+}
+</style>

+ 45 - 3
src/components/normal-basic-layout/details/modules/task/index.vue

@@ -3,12 +3,19 @@
     <div class="normal-panel mt-10">
       <div class="flex-align-center flex-between " style="border-bottom:1px solid #f1f2f3;padding:10px">
         任务事项
-        <addTask></addTask>
+        <addTask :ownertable="ownertable" @onSuccess="listData"></addTask>
+      </div>
+      <div class="task_list__panel" v-for="item in list" :key="item.sys_taskid">
+        <div class="flex-align-center flex-between">
+          <p class="task_title" @click="taskDetail(item)"><b>{{item.title}}</b></p>
+          <small>{{item.starttime.split(' ')[0]}}</small>
+        </div>
       </div>
     </div>
   </template>
   
   <script>
+    
   import addTask from './addTask.vue'
   export default {
     props:['ownertable'],
@@ -17,11 +24,26 @@
     },
     data () {
       return {
-        options:[]
-        
+        list:[]
       }
     },
     methods:{
+      async listData () {
+        const res = await this.$api.requested({
+          "id":20220902085001,
+          "content": {
+            "ownertable":this.ownertable,
+            "ownerid":this.$route.query.id
+          }
+        })
+        this.list = res.data
+      },
+      taskDetail (item) {
+        this.$router.replace({path:'/taskDetails',query:{id:item.sys_taskid,rowindex:item.rowindex}})
+      }
+    },
+    mounted () {
+      this.listData()
     }
   }
   
@@ -31,5 +53,25 @@
   <style scoped>
   .normal-panel{
     border-radius: 5px;
+    padding-bottom: 10px;
+  }
+  .task_list__panel{
+    padding:0 10px;
+    margin:10px 0;
+  }
+  .task_list__panel:last-child{
+    margin-bottom: 0 !important;
+  }
+  .task_title{
+    width: 200px;
+    overflow: hidden;
+    text-overflow:ellipsis;
+    white-space: nowrap;
+    color:#3874F6;
+    text-decoration: underline;
+    cursor: pointer;
+  }
+  .task_title + small{
+    color:#999
   }
   </style>

+ 0 - 1
src/components/normal-basic-layout/index.vue

@@ -81,7 +81,6 @@
 
 <script>
 import {mapGetters} from 'vuex'
-import { log } from '@antv/g2plot/lib/utils'
 export default {
   componentName:'normalTable',
   props:['tableName','idName','tableData','apiId','formPath','oldFormPath','options','autoQuery','detailPath','customTitle','hidePagination'],

+ 1 - 1
src/style/style.css

@@ -56,7 +56,7 @@ ul{
 .flex-align-start{
   display: flex;
   flex-wrap: wrap;
-  align-items: start;
+  align-items: flex-start;
 }
 .flex-between{
   justify-content: space-between;

+ 14 - 13
src/views/login/login.vue

@@ -9,17 +9,13 @@
         <div class="login-form">
           <h4 class="title">登录</h4>
           <el-tabs v-model="activeName">
-            <el-tab-pane label="短信登录" name="first">
-              <el-form :rules="rules" ref="loginForm"  :model="loginForm">
+            <el-tab-pane label="账号登录" name="first">
+              <el-form :rules="rules2" ref="loginForm"  :model="loginForm">
                 <el-form-item prop="phonenumber">
-                  <el-input v-model="loginForm.phonenumber" placeholder="账号"></el-input>
+                  <el-input v-model="loginForm.phonenumber" placeholder="账号" @keyup.native.enter="loginbyaccount"></el-input>
                 </el-form-item> 
                 <el-form-item prop="password">
-                  <el-input v-model="loginForm.password" placeholder="验证码">
-                    <template slot="append">
-                      <span v-if="count > 0">{{count === 0?'获取验证码':count+ 's'}}</span>
-                      <el-button v-else @click="countDown" type="primary">{{count === 0?'获取验证码':count+ 's'}}</el-button>
-                    </template>
+                  <el-input v-model="loginForm.password" type="password" placeholder="密码" @keyup.native.enter="loginbyaccount">
                   </el-input>
                 </el-form-item>
                 <el-form-item>
@@ -29,17 +25,21 @@
                   </div>
                 </el-form-item>
                 <el-form-item>
-                  <el-button type="primary" style="width:100%" @click="login">登 录</el-button>
+                  <el-button type="primary" style="width:100%" @click="loginbyaccount">登 录</el-button>
                 </el-form-item>
               </el-form>
             </el-tab-pane>
-            <el-tab-pane label="账号登录" name="second">
-              <el-form :rules="rules2" ref="loginForm"  :model="loginForm">
+            <el-tab-pane label="短信登录" name="second">
+              <el-form :rules="rules" ref="loginForm"  :model="loginForm">
                 <el-form-item prop="phonenumber">
                   <el-input v-model="loginForm.phonenumber" placeholder="账号"></el-input>
                 </el-form-item> 
                 <el-form-item prop="password">
-                  <el-input v-model="loginForm.password" type="password" placeholder="密码">
+                  <el-input v-model="loginForm.password" placeholder="验证码">
+                    <template slot="append">
+                      <span v-if="count > 0">{{count === 0?'获取验证码':count+ 's'}}</span>
+                      <el-button v-else @click="countDown" type="primary">{{count === 0?'获取验证码':count+ 's'}}</el-button>
+                    </template>
                   </el-input>
                 </el-form-item>
                 <el-form-item>
@@ -49,10 +49,11 @@
                   </div>
                 </el-form-item>
                 <el-form-item>
-                  <el-button type="primary" style="width:100%" @click="loginbyaccount">登 录</el-button>
+                  <el-button type="primary" style="width:100%" @click="login">登 录</el-button>
                 </el-form-item>
               </el-form>
             </el-tab-pane>
+            
           </el-tabs>
           <!-- <el-divider><span style="color:#999;font-weight:300">其他登录方式</span></el-divider>
           <span>敬请期待</span> -->