index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" label-width="68px">
  4. <el-form-item label="任务编码" prop="taskCode">
  5. <el-input
  6. v-model="queryParams.taskCode"
  7. clearable
  8. @keyup.enter.native="handleQuery"
  9. />
  10. </el-form-item>
  11. <el-form-item label="客户名称" prop="customerName">
  12. <el-input
  13. v-model="queryParams.customerName"
  14. clearable
  15. @keyup.enter.native="handleQuery"
  16. />
  17. </el-form-item>
  18. <el-form-item label="部门" prop="deptName">
  19. <el-input
  20. v-model="queryParams.deptName"
  21. clearable
  22. @keyup.enter.native="handleQuery"
  23. />
  24. </el-form-item>
  25. <el-form-item label="执行人" prop="staffName">
  26. <el-input
  27. v-model="queryParams.staffName"
  28. clearable
  29. @keyup.enter.native="handleQuery"
  30. />
  31. </el-form-item>
  32. <el-form-item label="执行时间">
  33. <el-date-picker
  34. size="mini"
  35. v-model="dateRange"
  36. style="width: 240px"
  37. value-format="yyyy-MM-dd"
  38. type="daterange"
  39. range-separator="-"
  40. :picker-options="pickerOptions"
  41. ></el-date-picker>
  42. </el-form-item>
  43. <el-form-item size="mini" label="拜访目的" prop="purpose">
  44. <el-select v-model="queryParams.purpose" placeholder="" clearable>
  45. <el-option
  46. v-for="dict in dict.type.mk_bo_behavior_goal"
  47. :key="dict.value"
  48. :label="dict.label"
  49. :value="dict.value"
  50. ></el-option>
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item>
  54. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  55. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  56. </el-form-item>
  57. </el-form>
  58. <div class="btn_grooup">
  59. <el-button
  60. type="warning"
  61. plain
  62. icon="el-icon-download"
  63. size="mini"
  64. @click="handleExport"
  65. >导出</el-button>
  66. </div>
  67. <el-table v-loading="loading" :data="behaviorList">
  68. <el-table-column label="负责人" align="center" prop="staffName" />
  69. <el-table-column label="行动日期" align="center" prop="time" />
  70. <el-form-item label="行动日期" prop="time">
  71. <el-date-picker clearable
  72. v-model="form.time"
  73. type="date"
  74. value-format="yyyy-MM-dd"
  75. placeholder="请选择行动日期">
  76. </el-date-picker>
  77. </el-form-item>
  78. <el-table-column label="联系人" align="center" prop="linkmanName" />
  79. <el-table-column label="拜访效果" align="center" prop="result" >
  80. <template slot-scope="scope">
  81. <dict-tag :options="dict.type.mk_bo_behavior_res" :value="scope.row.result"/>
  82. </template>
  83. </el-table-column>
  84. <el-table-column label="是否上级协助" align="center" prop="assist" >
  85. <template slot-scope="scope">
  86. <dict-tag :options="dict.type.sys_yes_no" :value="scope.row.assist"/>
  87. </template>
  88. </el-table-column>
  89. <el-table-column show-overflow-tooltip label="协助内容" align="center" prop="assistContent" />
  90. <el-table-column show-overflow-tooltip label="洽谈内容" align="center" prop="content" />
  91. <el-table-column width="150" label="任务编码" align="center" prop="taskCode"/>
  92. <el-table-column label="行动类型" align="center" prop="type">
  93. <template slot-scope="scope">
  94. <dict-tag :options="dict.type.mk_bo_behavior_type" :value="scope.row.type"/>
  95. </template>
  96. </el-table-column>
  97. <el-table-column show-overflow-tooltip label="客户" align="center" prop="customerName"/>
  98. <el-table-column label="拜访目的" align="center" prop="purpose">
  99. <template slot-scope="scope">
  100. <dict-tag :options="dict.type.mk_bo_behavior_goal" :value="scope.row.purpose"/>
  101. </template>
  102. </el-table-column>
  103. <el-table-column show-overflow-tooltip label="销售组织" align="center" prop="salesOrgName"/>
  104. <el-table-column show-overflow-tooltip label="部门" align="center" prop="deptName"/>
  105. <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
  106. <template slot-scope="scope">
  107. <el-button
  108. size="mini"
  109. type="text"
  110. icon="el-icon-view"
  111. @click="handleBrowse(scope.row)"
  112. >查看</el-button>
  113. </template>
  114. </el-table-column>
  115. </el-table>
  116. <pagination
  117. v-show="total>0"
  118. :total="total"
  119. :page.sync="queryParams.pageNum"
  120. :limit.sync="queryParams.pageSize"
  121. @pagination="getList"
  122. class="paginationClass"
  123. />
  124. <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
  125. <el-form size="mini" ref="form" :model="form" :rules="rules" label-width="80px" :disabled="this.operatingState == 'Browse'">
  126. <el-divider content-position="left">
  127. <dev style="width: 50px; height: 40px; font-size: 18px">基本信息</dev>
  128. </el-divider>
  129. <el-row>
  130. <el-col :span="8">
  131. <el-form-item label="任务" prop="taskId">
  132. <el-input v-model="form.taskCode"/>
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="8">
  136. <el-form-item label="行动类型" prop="type">
  137. <el-select v-model="form.type" placeholder="">
  138. <el-option
  139. v-for="dict in dict.type.mk_bo_behavior_type"
  140. :key="dict.value"
  141. :label="dict.label"
  142. :value="dict.value"
  143. ></el-option>
  144. </el-select>
  145. </el-form-item>
  146. </el-col>
  147. <el-col :span="8">
  148. <el-form-item label="行动日期" prop="time">
  149. <el-date-picker clearable
  150. v-model="form.time"
  151. type="date"
  152. value-format="yyyy-MM-dd"
  153. placeholder="">
  154. </el-date-picker>
  155. </el-form-item>
  156. </el-col>
  157. </el-row>
  158. <el-row>
  159. <el-col :span="8">
  160. <el-form-item label="客户" prop="customerName">
  161. <el-input v-model="form.customerName"/>
  162. </el-form-item>
  163. </el-col>
  164. <el-col :span="8">
  165. <el-form-item label="联系人" prop="linkmanName">
  166. <dr-popover-select v-model="form.linkmanName" title="联系人" type="LINKMAN_PARAM" :dataMapping="{
  167. linkman: 'id',
  168. linkmanName: 'name',
  169. }" :source.sync="form"
  170. :queryParams="additionalCondition"
  171. >
  172. </dr-popover-select>
  173. </el-form-item>
  174. </el-col>
  175. <el-col :span="8">
  176. <el-form-item label="拜访目的" prop="purpose">
  177. <el-select v-model="form.purpose" placeholder="">
  178. <el-option
  179. v-for="dict in dict.type.mk_bo_behavior_goal"
  180. :key="dict.value"
  181. :label="dict.label"
  182. :value="dict.value"
  183. ></el-option>
  184. </el-select>
  185. </el-form-item>
  186. </el-col>
  187. </el-row>
  188. <el-row>
  189. <el-col :span="8">
  190. <el-form-item label="拜访效果" prop="result">
  191. <el-select v-model="form.result">
  192. <el-option
  193. v-for="dict in dict.type.mk_bo_behavior_res"
  194. :key="dict.value"
  195. :label="dict.label"
  196. :value="dict.value"
  197. ></el-option>
  198. </el-select>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="8">
  202. <el-form-item label="是否上级协助" prop="assist">
  203. <el-select v-model="form.assist">
  204. <el-option
  205. v-for="dict in dict.type.sys_yes_no"
  206. :key="dict.value"
  207. :label="dict.label"
  208. :value="dict.value"
  209. ></el-option>
  210. </el-select>
  211. </el-form-item>
  212. </el-col>
  213. <el-col :span="8">
  214. <el-form-item label="协助内容" prop="assistContent" v-show="form.assist == 'Y'" :rules="form.assist == 'Y' ? rules.assistContent : [{require: false}]">
  215. <el-input v-model="form.assistContent"/>
  216. </el-form-item>
  217. </el-col>
  218. </el-row>
  219. <el-row>
  220. <el-col :span="8">
  221. <el-form-item label="销售区域" prop="marketingAreaName">
  222. <dr-popover-select v-model="form.marketingAreaName" title="销售区域" type="MK_SALESAREA_PARAM" :dataMapping="{
  223. marketingArea: 'id',
  224. marketingAreaName: 'name',
  225. }" :source.sync="form"
  226. >
  227. </dr-popover-select>
  228. </el-form-item>
  229. </el-col>
  230. </el-row>
  231. <el-row>
  232. <el-col :span="8">
  233. <el-form-item label="销售组织" prop="salesOrgName">
  234. <el-input v-model="form.salesOrgName" :disabled="true"/>
  235. </el-form-item>
  236. </el-col>
  237. <el-col :span="8">
  238. <el-form-item label="部门" prop="deptName">
  239. <el-input v-model="form.deptName" :disabled="true"/>
  240. </el-form-item>
  241. </el-col>
  242. <el-col :span="8">
  243. <el-form-item label="负责人" prop="staffName">
  244. <el-input v-model="form.staffName" :disabled="true"/>
  245. </el-form-item>
  246. </el-col>
  247. </el-row>
  248. <el-divider content-position="left">
  249. <dev style="width: 50px; height: 40px; font-size: 18px">跟进内容</dev>
  250. </el-divider>
  251. <el-form-item label="内容" prop="content" >
  252. <el-input
  253. type="textarea"
  254. :rows="2"
  255. maxlength=900
  256. placeholder="填写提示:今天拜访了谁,收集了什么述求,达成了什么结果,下一步计划。"
  257. autosize
  258. v-model="form.content">
  259. </el-input>
  260. </el-form-item>
  261. <el-divider content-position="left">
  262. <dev style="width: 50px; height: 40px; font-size: 18px">照片信息</dev>
  263. </el-divider>
  264. <el-upload
  265. action="actionUrl"
  266. list-type="picture-card"
  267. :on-change="uploadPic"
  268. :on-preview="handlePictureCardPreview"
  269. :on-remove="handleRemove"
  270. :auto-upload="false"
  271. :file-list="fileList"
  272. >
  273. <i class="el-icon-plus"></i>
  274. </el-upload>
  275. <el-dialog :visible.sync="dialogVisible">
  276. <img width="100%" :src="dialogImageUrl" alt="">
  277. </el-dialog>
  278. <div v-if="form.stage">
  279. <el-divider content-position="left">
  280. <dev style="width: 50px; height: 40px; font-size: 18px">签卡信息</dev>
  281. </el-divider>
  282. <el-table v-loading="loading" :data="form.behaviorXys" height="150px">
  283. <el-table-column width="150" label="签卡类型" align="center" prop="type">
  284. <template slot-scope="scope">
  285. <dict-tag :options="dict.type.mk_bo_signintype" :value="scope.row.type"/>
  286. </template>
  287. </el-table-column>
  288. <el-table-column width="150" label="签卡时间" align="center" prop="createTime" />
  289. <el-table-column label="签到地址" align="center" prop="address" />
  290. </el-table>
  291. </div>
  292. <div class="md-auditInfo">
  293. <el-divider content-position="left">
  294. <dev style="width: 50px; height: 40px; font-size: 18px">其它信息</dev>
  295. </el-divider>
  296. <el-row>
  297. <el-col :span="6">
  298. <el-form-item label="创建人">
  299. <el-input v-model="form.createByName" readonly></el-input>
  300. </el-form-item>
  301. </el-col>
  302. <el-col :span="6">
  303. <el-form-item label="创建时间">
  304. <el-input v-model="form.createTime" readonly></el-input>
  305. </el-form-item>
  306. </el-col>
  307. <el-col :span="6">
  308. <el-form-item label="修改人">
  309. <el-input v-model="form.updateByName" readonly></el-input>
  310. </el-form-item>
  311. </el-col>
  312. <el-col :span="6">
  313. <el-form-item label="修改时间">
  314. <el-input v-model="form.updateTime" readonly></el-input>
  315. </el-form-item>
  316. </el-col>
  317. </el-row>
  318. </div>
  319. </el-form>
  320. </el-dialog>
  321. </div>
  322. </template>
  323. <script>
  324. import { listBehavior, getBehavior} from "@/api/business/spd/bo/behavior";
  325. export default {
  326. name: "Behavior",
  327. dicts: ['mk_bo_behavior_res','mk_bo_behavior_type','sys_yes_no','mk_bo_behavior_goal','mk_bo_signintype'],
  328. data() {
  329. return {
  330. dialogImageUrl: '',
  331. dialogVisible: false,
  332. disabled: false,
  333. actionUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址,
  334. fileList: [],
  335. // 遮罩层
  336. loading: true,
  337. // 选中数组
  338. ids: [],
  339. // 非单个禁用
  340. single: true,
  341. // 非多个禁用
  342. multiple: true,
  343. // 显示搜索条件
  344. showSearch: true,
  345. // 总条数
  346. total: 0,
  347. // 行动表格数据
  348. behaviorList: [],
  349. // 弹出层标题
  350. title: "",
  351. // 是否显示弹出层
  352. open: false,
  353. // 查询参数
  354. queryParams: {
  355. pageNum: 1,
  356. pageSize: 10,
  357. taskId: null,
  358. type: null,
  359. time: null,
  360. customer: null,
  361. customerName: null,
  362. linkman: null,
  363. linkmanName: null,
  364. purpose: null,
  365. result: null,
  366. assist: null,
  367. assistContent: null,
  368. salesOrg: null,
  369. salesOrgName: null,
  370. dept: null,
  371. deptName: null,
  372. staff: null,
  373. staffName: null,
  374. content: null,
  375. tenantId: null,
  376. revision: null,
  377. },
  378. // 查询日期范围
  379. dateRange: [],
  380. // 表单参数
  381. form: {},
  382. // 表单校验
  383. rules: {
  384. type: [
  385. { required: true, message: "行动类型不能为空", trigger: "blur" }
  386. ],
  387. time: [
  388. { required: true, message: "行动日期不能为空", trigger: "blur" }
  389. ],
  390. customerName: [
  391. { required: true, message: "客户不能为空", trigger: "blur" }
  392. ],
  393. linkmanName: [
  394. { required: true, message: "联系人不能为空", trigger: "blur" }
  395. ],
  396. purpose: [
  397. { required: true, message: "拜访目的不能为空", trigger: "blur" }
  398. ],
  399. assist: [
  400. { required: true, message: "是否需要上级协助不能为空", trigger: "blur" }
  401. ],
  402. assistContent: [
  403. { required: true, message: "协助内容不能为空", trigger: "blur" }
  404. ],
  405. staffName: [
  406. { required: true, message: "负责人不能为空", trigger: "blur" }
  407. ],
  408. content: [
  409. { required: true, message: "洽谈内容不能为空", trigger: "blur" }
  410. ],
  411. result: [
  412. { required: true, message: "拜访效果不能为空", trigger: "blur" }
  413. ],
  414. },
  415. //当前操作状态
  416. operatingState: '',
  417. pickerOptions: {
  418. shortcuts: [{
  419. text: '最近一周',
  420. onClick(picker) {
  421. const end = new Date();
  422. const start = new Date();
  423. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  424. picker.$emit('pick', [start, end]);
  425. }
  426. }, {
  427. text: '最近一个月',
  428. onClick(picker) {
  429. const end = new Date();
  430. const start = new Date();
  431. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  432. picker.$emit('pick', [start, end]);
  433. }
  434. }, {
  435. text: '最近三个月',
  436. onClick(picker) {
  437. const end = new Date();
  438. const start = new Date();
  439. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  440. picker.$emit('pick', [start, end]);
  441. }
  442. }]
  443. },
  444. };
  445. },
  446. created() {
  447. this.queryParams.params = {source:"list"};
  448. this.getList();
  449. },
  450. methods: {
  451. uploadPic(file, fileList) {
  452. this.fileList = fileList
  453. },
  454. handleRemove(file) {
  455. this.fileList = this.fileList.filter(item => item.uid !== file.uid)
  456. },
  457. handlePictureCardPreview(file) {
  458. this.dialogImageUrl = file.url;
  459. this.dialogVisible = true;
  460. },
  461. /** 查询行动列表 */
  462. getList() {
  463. this.loading = true;
  464. listBehavior(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
  465. this.behaviorList = response.rows;
  466. this.total = response.total;
  467. this.loading = false;
  468. });
  469. },
  470. /** 查看按钮操作 */
  471. handleBrowse(row) {
  472. this.reset();
  473. const id = row.id || this.ids
  474. getBehavior(id).then(response => {
  475. this.form = response.data;
  476. this.fileList = this.form.behaviorPs;
  477. this.open = true;
  478. this.operatingState = "Browse";
  479. this.title = "基础信息";
  480. });
  481. },
  482. // 取消按钮
  483. cancel() {
  484. this.open = false;
  485. this.reset();
  486. },
  487. // 表单重置
  488. reset() {
  489. this.form = {
  490. id: null,
  491. taskCode: null,
  492. type: null,
  493. time: null,
  494. customer: null,
  495. customerName: null,
  496. linkman: null,
  497. linkmanName: null,
  498. purpose: null,
  499. result: null,
  500. assist: null,
  501. assistContent: null,
  502. salesOrg: null,
  503. salesOrgName: null,
  504. dept: null,
  505. deptName: null,
  506. staff: null,
  507. staffName: null,
  508. content: null,
  509. tenantId: null,
  510. revision: null,
  511. createBy: null,
  512. createTime: null,
  513. updateBy: null,
  514. updateTime: null,
  515. delFlag: null
  516. };
  517. this.resetForm("form");
  518. },
  519. /** 搜索按钮操作 */
  520. handleQuery() {
  521. this.queryParams.pageNum = 1;
  522. this.getList();
  523. },
  524. /** 重置按钮操作 */
  525. resetQuery() {
  526. this.resetForm("queryForm");
  527. this.dateRange = [];
  528. this.handleQuery();
  529. },
  530. /** 导出按钮操作 */
  531. handleExport() {
  532. this.queryParams.params.pageNot = '1';
  533. this.download('mk/bo/behavior/export', {
  534. ...this.queryParams
  535. }, `behavior_${new Date().getTime()}.xlsx`)
  536. },
  537. additionalCondition(){
  538. return {
  539. parame:{
  540. customer: this.form.customer ? this.form.customer : 'xxx'
  541. }
  542. }
  543. },
  544. }
  545. };
  546. </script>
  547. <style lang="scss" scoped>
  548. .btn_grooup {
  549. margin-bottom: 10px;
  550. display: flex;
  551. justify-content: flex-end;
  552. }
  553. .paginationClass {
  554. z-index: 500;
  555. position: fixed;
  556. bottom: 10px;
  557. right: 10px;
  558. width: 100%;
  559. line-height: var(--footer-height);
  560. color: #fff;
  561. }
  562. </style>