add copy.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <template>
  2. <div>
  3. <el-button type="primary" size="small" @click="queryRoles(dialogFormVisible = true)">新 建</el-button>
  4. <el-drawer append-to-body title="新建模板" :visible.sync="dialogFormVisible" size="800px">
  5. <div class="drawer__panel">
  6. <el-row :gutter="20">
  7. <el-form :model="form" ref="form" :rules="rules" label-position="right" label-width="80px" size="small">
  8. <el-col :span="24">
  9. <el-form-item label="标题" prop="title">
  10. <el-input type="text" v-model="form.title" placeholder="输入提报标题"></el-input>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="12">
  14. <el-form-item label="开始日期" prop="begdate">
  15. <el-date-picker
  16. style="width:100%"
  17. v-model="form.begdate"
  18. type="date"
  19. :picker-options="pickerOptions"
  20. value-format="yyyy-MM-dd"
  21. placeholder="选择日期">
  22. </el-date-picker>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="12">
  26. <el-form-item label="结束日期" prop="enddate">
  27. <el-date-picker
  28. style="width:100%"
  29. v-model="form.enddate"
  30. type="date"
  31. :picker-options="pickerOptions"
  32. value-format="yyyy-MM-dd"
  33. placeholder="选择日期">
  34. </el-date-picker>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :span="24">
  38. <el-form-item label="提醒时间" prop="taskdays">
  39. <div class="flex-align-center"><span style="width:40px">提 前:</span><el-input type="number" style="width:200px" v-model="form.taskdays" placeholder="输入提醒时间"></el-input>&emsp;<span>天</span></div>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="24">
  43. <div class="flex-align-center my-error-panel">
  44. <el-form-item label="提报周期" prop="periodtype">
  45. <el-select style="width:120px" v-model="form.periodtype" placeholder="请选择提报周期" @change="handleChange">
  46. <el-option label="每周" value="周"></el-option>
  47. <el-option label="每月" value="月"></el-option>
  48. <el-option label="仅一次" value="once"></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label-width="0px" prop="periodpoint">
  52. <el-popover
  53. v-if="form.periodtype !== 'once'"
  54. placement="bottom"
  55. width="400"
  56. trigger="click">
  57. <div :class="error?'error':''" class="periodTags" slot="reference">
  58. <p v-if="form.periodpoint.length === 0">请选择</p>
  59. <div v-else>
  60. <el-tag v-for="item in form.periodpoint" type="info" size="mini" :key="item.index" style="margin-right:5px" @close="closeDate(item)" closable>
  61. {{form.periodtype === '周'?'周'+ `${item===7?'日':item}`:item+'日'}}
  62. </el-tag>
  63. </div>
  64. </div>
  65. <el-row>
  66. <el-col :class="act === item?'act':''" @click.native="clickdate(item)" style="height:50px;line-height:50px;text-align:center;cursor: pointer;" v-for="item in period" :key="item" :span="form.periodtype==='月'?4:8">{{form.periodtype === '周'?'周'+ `${item===7?'日':item}`:item+'日'}}</el-col>
  67. </el-row>
  68. </el-popover>
  69. </el-form-item>
  70. </div>
  71. </el-col>
  72. <el-col :span="24">
  73. <el-form-item label="提报要求">
  74. <el-checkbox v-model="form.baseonproject" :true-label="1" :false-label="0">按项目及产品类别预测</el-checkbox>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="24">
  78. <el-form-item label="备注">
  79. <el-input type="textarea" v-model="form.remarks" placeholder="请输入备注" :rows="3"></el-input>
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="24">
  83. <el-form-item label="发布范围" prop="roles">
  84. <el-select style="width:100%" v-model="form.roles" placeholder="请选择角色" multiple>
  85. <el-option v-for="item in rolelist" :key="item.roleid" :label="item.rolename" :value="item.roleid"></el-option>
  86. </el-select>
  87. </el-form-item>
  88. </el-col>
  89. </el-form>
  90. </el-row>
  91. </div>
  92. <div class="fixed__btn__panel">
  93. <el-button size="small" @click="dialogFormVisible = false" class="normal-btn-width">取 消</el-button>
  94. <el-button size="small" type="primary" @click="onSubmit" class="normal-btn-width">确 定</el-button>
  95. </div>
  96. </el-drawer>
  97. </div>
  98. </template>
  99. <script>
  100. export default {
  101. data () {
  102. return {
  103. error:false,
  104. dialogFormVisible:false,
  105. form:{
  106. sa_salesforecastmodelid:0,
  107. title:'',
  108. remarks:'',
  109. begdate:'',
  110. enddate:'',
  111. periodtype:'周',
  112. periodpoint:[],
  113. baseonproject:false,
  114. isrepeat:true,
  115. taskdays:0,
  116. sales:[],
  117. roles:[],
  118. },
  119. period:7,
  120. act:0,
  121. rolelist:[],
  122. rules:{
  123. title: [
  124. { required: true, message: '请输入提报标题', trigger: 'blur' },
  125. ],
  126. periodtype: [
  127. { required: true, message: '请选择周期', trigger: 'change' }
  128. ],
  129. begdate: [
  130. { required: true, message: '请选择开始日期', trigger: 'change' }
  131. ],
  132. enddate: [
  133. { validator:this.validateEndDate, required: true, trigger: 'change' }
  134. ],
  135. taskdays:[
  136. { required: false, message: '请输提醒天数', trigger: 'blur' },
  137. ],
  138. periodpoint:[
  139. { validator: this.checkPeriodpoint, trigger: 'blur' }
  140. ],
  141. roles: [
  142. { required: true, message: '请选择角色', trigger: 'change' }
  143. ],
  144. },
  145. pickerOptions:{
  146. disabledDate(time) {
  147. return time.getTime() < Date.now() - 8.64e7;
  148. }
  149. }
  150. }
  151. },
  152. methods:{
  153. checkPeriodpoint (rule, value, callback) {
  154. if (value.length === 0 && this.form.periodtype !== 'once') {
  155. this.error = true
  156. return callback(new Error('请选择周期'));
  157. } else {
  158. this.error = false
  159. callback();
  160. }
  161. },
  162. validateEndDate(rule, value, callback){
  163. let start = (new Date(this.form.begdate)).getTime()
  164. let end = (new Date(this.form.enddate)).getTime()
  165. if (value === '') {
  166. callback(new Error('请选择结束日期'));
  167. } else if (end < start) {
  168. callback(new Error('结束日期不能小于开始日期'));
  169. } else {
  170. // if (this.form.enddate !== '') {
  171. // this.$refs['form'].validateField('enddate');
  172. // }
  173. callback();
  174. }
  175. },
  176. onSubmit () {
  177. this.$refs['form'].validate(async (valid) => {
  178. if (!valid) return false
  179. let data = Object.assign({},this.form)
  180. data.roles = this.form.roles.map(e=>{
  181. return {
  182. "sa_salesforecastmodelroleid":0,
  183. "roleid": e
  184. }
  185. })
  186. data.periodtype === 'once'?data.periodtype= '':data.periodtype
  187. const res = await this.$api.requested({
  188. "id": 20220906150103,
  189. "version":1,
  190. "content": data
  191. })
  192. this.tool.showMessage(res,()=>{
  193. this.$emit('onSuccess')
  194. this.dialogFormVisible = false
  195. this.refrehsh()
  196. })
  197. });
  198. },
  199. clickdate (item) {
  200. this.act = item
  201. this.form.periodpoint.push(item)
  202. this.form.periodpoint = [...[],...new Set(this.form.periodpoint)]
  203. },
  204. closeDate (item) {
  205. this.form.periodpoint = this.form.periodpoint.filter(e=>{
  206. return e !== item
  207. })
  208. },
  209. handleChange (val) {
  210. this.form.isrepeat = true
  211. this.form.periodpoint = []
  212. val === '月'?this.period = 31:val==='周'?this.period =7:this.form.isrepeat = false
  213. },
  214. async queryRoles () {
  215. const res = await this.$api.requested({
  216. "id":20221101131902,
  217. "content": {
  218. "pageNumber": 1,
  219. "pageSize": 1000,
  220. "where":{
  221. "condition":"",
  222. "usertype":"",
  223. "issystem":1
  224. }
  225. }
  226. })
  227. this.rolelist = res.data
  228. },
  229. refrehsh () {
  230. this.form = {
  231. sa_salesforecastmodelid:0,
  232. title:'',
  233. remarks:'',
  234. begdate:'',
  235. enddate:'',
  236. periodtype:'周',
  237. periodpoint:[],
  238. baseonproject:false,
  239. isrepeat:true,
  240. taskdays:0,
  241. sales:[],
  242. roles:[],
  243. }
  244. }
  245. },
  246. mounted () {
  247. }
  248. }
  249. </script>
  250. <style>
  251. .my-error-panel .el-form-item__error{
  252. text-indent: 10px;
  253. }
  254. </style>
  255. <style scoped>
  256. .periodTags{
  257. border:1px solid #dcdfe6;
  258. min-height:32px;
  259. /* margin-bottom:18px; */
  260. padding:0 10px;
  261. margin-left:10px;
  262. line-height:32px;
  263. border-radius: 4px;
  264. min-width: 400px;
  265. cursor: pointer;
  266. }
  267. .act{
  268. background: #dcdfe6;
  269. }
  270. .error{
  271. border:1px solid red !important;;
  272. }
  273. </style>