master
271556543@qq.com 4 years ago
parent 16b185d18b
commit 7654265fd0

@ -0,0 +1,33 @@
import request from "@/utils/request";
export function getList(params){
return request({
method:'get',
url:'/api/admin/schedule_list_log/get-list',
params
})
}
export function getForm(id,params){
return request({
method:'get',
url:`/api/admin/schedule_list_log/get-form/${id}`,
params
})
}
export function save(data){
return request({
method:'post',
url:'/api/admin/schedule_list_log/save',
data
})
}
export function destroy(id,data){
return request({
method:'post',
url:`/api/admin/schedule_list_log/delete/${id}`,
data
})
}

@ -0,0 +1,33 @@
import request from "@/utils/request";
export function getList(params){
return request({
method:'get',
url:'/api/admin/schedule_list_sku/get-list',
params
})
}
export function getForm(id,params){
return request({
method:'get',
url:`/api/admin/schedule_list_sku/get-form/${id}`,
params
})
}
export function save(data){
return request({
method:'post',
url:'/api/admin/schedule_list_sku/save',
data
})
}
export function destroy(id,data){
return request({
method:'post',
url:`/api/admin/schedule_list_sku/delete/${id}`,
data
})
}

@ -1,6 +1,10 @@
<script>
export default {
props: {
size:{
type:String,
default:'medium'
},
height: {
type: Number
},
@ -181,6 +185,7 @@ export default {
},
render(h) {
let {
size,
createPage,
summaryMethod,
cellClick,
@ -214,6 +219,7 @@ export default {
{tableItem && tableItem.length > 0 ?
(<el-table
ref="table"
size={size}
show-summary={showSummary}
show-header={showHeader}
summary-method={summaryMethod}

@ -71,6 +71,24 @@
</div>
</template>
<template v-slot:max_age>
<div class="xy-table-item">
<div class="xy-table-item-label">
年龄限制
</div>
<div class="xy-table-item-content">
<el-slider
:marks="marks"
:value="[form.min_age,form.max_age]"
range
:max="100"
style="width: 300px"
@input="e => {form.min_age = e[0];form.max_age = e[1]}">
</el-slider>
</div>
</div>
</template>
<template v-slot:product_sku_list>
<div class="xy-table-item">
<div class="xy-table-item-label">
@ -110,6 +128,13 @@ export default {
id: '',
isShow: false,
type: 'add',
marks: {
0: '0岁',
30: '30岁',
50: '50岁',
70: '70岁',
90: '90岁'
},
form: {
name: '',
@ -117,6 +142,8 @@ export default {
cycle: '',
flow: '',
sortnumber: 0,
max_age:0,
min_age:100,
product_sku_list:[]
},
rules: {
@ -156,6 +183,7 @@ export default {
}
},
methods: {
async getDetail() {
const res = await getForm(this.id)
@ -223,4 +251,7 @@ export default {
::v-deep .el-input__inner {
text-align: left;
}
::v-deep .el-slider__marks-text{
margin-top: 6px !important;
}
</style>

@ -156,26 +156,27 @@
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>失能等级
</div>
<div class="xy-table-item-content">
<el-cascader
:value="form.level_id"
style="width: 300px;"
placeholder="失能等级选择"
:options="disabilityLevel"
:props="{
label:'value',
value:'id',
}"
@change="e => form.level_id = e.at(-1)">
</el-cascader>
<!-- <el-select v-model="form.level_id" placeholder="请选择失能等级" style="width: 300px;">-->
<!-- <el-option v-for="item in disabilityLevel" :key="item.id" :label="item.value"-->
<!-- :value="item.id"></el-option>-->
<!-- </el-select>-->
<el-select v-model="form.level_id" placeholder="请选择失能等级" style="width: 300px;">
<el-option v-for="item in disabilityLevel" :key="item.id" :label="item.value"
:value="item.id"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:level_type>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>失能类型
</div>
<div class="xy-table-item-content">
<el-select v-model="form.level_type" placeholder="请选择失能类型" style="width: 300px;">
<el-option v-for="item in levelTypes" :key="item.id" :label="item.value"
:value="item.id"></el-option>
</el-select>
</div>
</div>
</template>
<!-- 订单-->
<template v-slot:product_id>
@ -183,7 +184,7 @@
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>产品
</div>
<div class="xy-table-item-content">
<div class="xy-table-item-content" :class="ageTemp ? 'xy-table-item-outrange' : ''">
<el-select
:value="pickedProduct.name"
v-load-more="productLoad"
@ -334,6 +335,10 @@ export default {
type: Array,
default: () => []
},
levelTypes:{
type:Array,
default:()=>[]
},
cities:{
type: Array,
default: () => []
@ -470,6 +475,7 @@ export default {
birthday: '',
remark: '',
level_id: '',
level_type:''
},
rules: {
name: [
@ -521,6 +527,7 @@ export default {
//
products: [],
pickedProduct:{},
ageTemp:false,
productSelect: {
page: 1,
page_size: 10
@ -620,6 +627,7 @@ export default {
birthday: '',
remark: '',
level_id: '',
level_type:'',
}
this.form1 = {
product_id: '',
@ -733,12 +741,15 @@ export default {
this.pickedProduct = e
//
let age = getAgeByIdcard(this.customerIdcard)
if(age > 50 || age < 18){
if(age > this.pickedProduct.product_type.max_age || age < this.pickedProduct.product_type.min_age){
this.ageTemp = true
this.$message({
type:'warning',
message:'该客户不在产品服务年龄范围内',
duration:2000
})
}else{
this.ageTemp = false
}
this.form1.product_id = e.id
this.form1.product_type_id = e.product_type_id
@ -835,6 +846,7 @@ export default {
this.map = []
this.flag = 1
this.pickedProduct = {}
this.ageTemp = false
this.init()
}
},
@ -972,4 +984,18 @@ export default {
::v-deep .el-input__inner {
text-align: left;
}
.xy-table-item-outrange{
position: relative;
&::after{
content:'超出年龄范围';
color: red;
font-size: 12px;
position: absolute;
right: 0;
bottom: -30px;
}
}
</style>

@ -13,7 +13,7 @@
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>产品
</div>
<div class="xy-table-item-content">
<div class="xy-table-item-content" :class="ageTemp ? 'xy-table-item-outrange' : ''">
<el-select
clearable
:value="pickedProduct.name"
@ -216,6 +216,7 @@ export default {
page_size: 10
},
pickedProduct:{},
ageTemp:false,
form: {
product_id: '',
product_type_id:'',
@ -303,12 +304,15 @@ export default {
//
let age = getAgeByIdcard(this.customerIdcard)
if(age > 50 || age < 18){
if(age > this.pickedProduct.product_type.max_age || age < this.pickedProduct.product_type.min_age){
this.ageTemp = true
this.$message({
type:'warning',
message:'该客户不在产品服务年龄范围内',
duration:2000
})
}else{
this.ageTemp = false
}
this.form.product_id = e.id
@ -409,6 +413,7 @@ export default {
this.getProducts()
} else {
this.pickedProduct = {}
this.ageTemp = false
this.products = []
this.$refs['dialog'].reset()
//this.initForm()
@ -426,4 +431,18 @@ export default {
::v-deep .el-input__inner {
text-align: left;
}
.xy-table-item-outrange{
position: relative;
&::after{
content:'超出年龄范围';
color: red;
font-size: 12px;
position: absolute;
right: 0;
bottom: -30px;
}
}
</style>

@ -46,7 +46,7 @@
</xy-table>
<addOrder ref="addOrder" :types="types" :accounts="accounts"></addOrder>
<add-customer ref="addCustomer" :types="types" :accounts="accounts" :cities="cities" :disability-level="disabilityLevel" @refresh="getCustomers"></add-customer>
<add-customer ref="addCustomer" :level-types="levelTypes" :types="types" :accounts="accounts" :cities="cities" :disability-level="disabilityLevel" @refresh="getCustomers"></add-customer>
</div>
</template>
@ -71,6 +71,7 @@ export default {
keyword: ''
},
disabilityLevel: [],
levelTypes:[],
cities:[],
accounts:[],
types:[],
@ -237,14 +238,14 @@ export default {
}
},
methods: {
async getLevelTypes(){
const types = await getparameter({number: 'disabilityType'},false)
this.levelTypes = types.detail
},
async getDisabilityLevel() {
const levels = await getparameter({number: 'disabilityLevel'},false)
const types = await getparameter({number: 'disabilityType'},false)
this.disabilityLevel = types.detail.map(item => {
item.children = levels.detail
return item
})
this.disabilityLevel = levels.detail
},
async getCustomers() {
@ -292,6 +293,7 @@ export default {
},
mounted() {
this.getDisabilityLevel()
this.getLevelTypes()
this.getCustomers()
this.getCity()
this.getAccounts()

@ -0,0 +1,323 @@
<template>
<div>
<xy-dialog ref="dialog" :is-show.sync="isShow" type="form" :title="type === 'add' ? '新增打卡记录' : '编辑打卡记录'" :form="form" :rules="rules" @submit="submit">
<template v-slot:schedule_list_id>
</template>
<template v-slot:lat>
<div class="xy-table-item">
<div class="xy-table-item-label">
经度
</div>
<div class="xy-table-item-content">
<el-input readonly v-model="form.lat " clearable placeholder="请输入经度 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:lng>
<div class="xy-table-item">
<div class="xy-table-item-label">
纬度
</div>
<div class="xy-table-item-content">
<el-input readonly v-model="form.lng " clearable placeholder="请输入纬度 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:address>
<div class="xy-table-item" style="margin-bottom: 22px;">
<div class="xy-table-item-label">
地图选择
</div>
<div class="xy-table-item-content">
<avue-input-map v-model="map" :params="option" class="avue-map-input" placeholder="请选择地图"
style="width: 300px;"></avue-input-map>
</div>
</div>
<div class="xy-table-item">
<div class="xy-table-item-label">
定位地址
</div>
<div class="xy-table-item-content">
<el-input v-model="form.address " clearable placeholder="请输入定位地址 " style="width: 300px;" />
</div>
</div>
</template>
<template v-slot:type>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>打卡类型
</div>
<div class="xy-table-item-content">
<el-select v-model="form.type" clearable placeholder="请选择打卡类型 " style="width: 300px;">
<el-option v-for="item in types" :key="item.id" :label="item.value" :value="item.id"></el-option>
</el-select>
</div>
</div>
<template v-if="form.type === 3">
<div class="xy-table-item">
<div class="xy-table-item-label">
服务记录
</div>
<div class="xy-table-item-content">
<xy-table style="margin-top: 20px;" size="mini" :height="200" :is-page="false" :list="scheduleInfo().sku" :table-item="skuTable">
<template v-slot:btns><</template>
</xy-table>
</div>
</div>
</template>
</template>
<template v-slot:upload_list>
<div class="xy-table-item">
<div class="xy-table-item-label">
打卡照片
</div>
<div class="xy-table-item-content">
<el-upload
class="upload-demo"
:action="action"
:on-error="uploadFail"
:before-upload="uploadBefore"
:file-list="fileList"
:on-success="uploadSuccess"
:on-remove="remove"
list-type="picture"
style="width: 300px;">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件且不超过2M</div>
</el-upload>
<!-- <div v-if="form.avatar" style="position: relative;">-->
<!-- <img :src="form.avatar" class="avatar">-->
<!-- <Button class="img__delete" icon="md-close" shape="circle" size="small" type="error" @click="form.upload_list = []"></Button>-->
<!-- </div>-->
<!-- <el-upload v-else :action="action" :before-upload="uploadBefore" :limit="1" :on-error="uploadFail" :on-success="uploadSuccess" :show-file-list="true" accept="picture" class="avatar-uploader" list-type="picture-card">-->
<!-- <i class="el-icon-plus avatar-uploader-icon"></i>-->
<!-- </el-upload>-->
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
getForm,
save
} from '@/api/scheduleListLog';
import { save as saveSku } from '@/api/scheduleListSku'
export default {
props:{
scheduleListId:[Number,String],
types: {
type:Array,
default:()=>[{id:1,value:'签到'},{id:2,value:'过程打卡'},{id:3,value:'签退'}]
}
},
inject:['scheduleInfo'],
data() {
return {
isShow: false,
id: '',
type: '',
action: process.env.VUE_APP_UPLOAD_API,
map: [],
option: {
column: [
{
label: '坐标',
prop: 'map',
type: 'map',
//
params: {
zoom: 10,
// zoomEnable: false,
// dragEnable: false,
}
}]
},
skuTable:[
{
prop:'sku_info.name',
label:'服务名称',
minWidth:120
},
{
prop:'sku_info.time_lenth',
label:'应服务时间(分钟)',
width: 130
},
{
label:'实际服务时间(分钟)',
width: 140,
customFn:(row) => {
return (
<el-input value={row.time} placeholder="实际服务时间" size="small" on={{['input']: e=>row.time = e}}></el-input>
)
}
}
],
fileList:[],
form: {
schedule_list_id: "",
address: "",
lat: "",
lng: "",
type: "",
upload_list: [],
},
rules: {
type:[
{ required:true,message:'请选择打卡类型' }
]
}
}
},
methods: {
//
uploadFail(err) {
console.log(err)
},
uploadSuccess(response) {
console.log(response)
this.form.upload_list.push({upload_id:response.id})
},
uploadBefore(file) {
console.log(file)
if ((file.size / 1000) > 2024) {
this.$message({
type: 'warning',
message: '上传图片大小超过2M'
})
return false
}
},
remove(file,fileList){
this.form.upload_list = fileList.map(item => {
return {
upload_id:item.upload_id
}
})
},
async getDetail() {
const res = await getForm(this.id)
this.$integrateData(this.form, res)
console.log(this.form)
},
async submit() {
if(this.type === 'add'){
if(this.form.hasOwnProperty('id')){
delete this.form.id
}
}
if (this.type === 'editor') {
Object.defineProperty(this.form, 'id', {
value: this.id,
enumerable: true,
configurable: true,
writable: true
})
}
if(this.form.type === 3){
let promiseAll = this.scheduleInfo().sku.map(item => {
return saveSku({
id:item.id,
schedule_list_id:item.schedule_list_id,
sku_id:item.sku_id,
time:item.time
})
})
await Promise.all(promiseAll)
}
await save(this.form)
this.$successMessage(this.type, '打卡记录')
this.isShow = false
this.$emit('refresh')
}
},
watch: {
isShow(val) {
if (val) {
console.log(1111,this.scheduleInfo().sku)
this.form.schedule_list_id = this.scheduleListId
if (this.type === 'editor') {
this.getDetail()
}
} else {
this.map = []
this.fileList = []
this.id = ''
this.type = ''
this.$refs['dialog'].reset()
delete this.form.id
}
},
map(val) {
if (val.length === 0 || !val) return
this.form.lng = val[0]
this.form.lat = val[1]
if(!this.form.address)this.form.address = val[2]
}
}
}
</script>
<style scoped lang="scss">
@import "src/styles/index";
::v-deep .el-input__inner {
text-align: left;
}
.img__delete {
transform: scale(0.8, 0.8);
position: absolute;
top: 4px;
right: 4px;
}
::v-deep .avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
::v-deep .avatar-uploader .el-upload:hover {
border-color: $primaryColor;
}
::v-deep .el-upload--picture-card {
font-size: 28px;
color: #8c939d;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
text-align: center;
}
::v-deep .avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
text-align: center;
}
::v-deep .avatar {
width: 80px !important;
display: block;
border-radius: 6px;
}
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -12,17 +12,17 @@
</div>
<div class="serve-detail__btn">
<el-button size="small" type="primary" round>录入服务记录</el-button>
<el-button size="small" type="primary" round @click="$refs['addScheduleListLog'].type= 'add',$refs['addScheduleListLog'].isShow = true">录入服务记录</el-button>
</div>
</div>
<xy-table :height="300" :is-page="false" :table-item="columns" :list="detail">
<template v-slot:btns>
<el-table-column align="center" width="80" label="照片查看" header-align="center">
<el-table-column align="center" width="80" label="操作" header-align="center">
<template v-slot:default="scope">
<Poptip transfer placement="top" >
<template v-slot:default>
<Button type="primary" size="small" @click="setPicList(scope.row)"></Button>
<Button type="primary" size="small" @click="setPicList(scope.row)"></Button>
</template>
<template v-slot:content>
@ -31,6 +31,8 @@
</template>
</template>
</Poptip>
<Button type="primary" size="small" @click="editor(scope)"></Button>
</template>
</el-table-column>
</template>
@ -41,13 +43,22 @@
<div></div>
</template>
</xy-dialog>
<addScheduleListLog ref="addScheduleListLog" :schedule-list-id="id" @refresh="getDetail"></addScheduleListLog>
</div>
</template>
<script>
import {scheduleLog} from '@/api/schedule'
import addScheduleListLog from "@/views/finance/component/addScheduleListLog";
export default {
components:{
addScheduleListLog
},
props:{
},
data() {
return {
id:'',
@ -94,6 +105,20 @@ export default {
}
},
methods: {
editor(scope){
console.log(scope)
this.$refs['addScheduleListLog'].fileList = scope.row.upload_list.map(item => {
return {
url:item.upload?.url,
name:item.upload?.name,
upload_id:item.upload?.id
}
})
this.$refs['addScheduleListLog'].id = scope.row.id
this.$refs['addScheduleListLog'].type= 'editor'
this.$refs['addScheduleListLog'].isShow = true
},
setPicList(row){
this.picList = row.upload_list.map(item => item.upload?.url)
},

@ -134,6 +134,11 @@ export default {
width: 200,
sortable:false
},
{
prop:'time_total',
label:'总服务时长',
width: 140
},
{
label:'服务状态',
prop:'status',

@ -48,10 +48,16 @@ export default {
components:{
detail
},
provide(){
return {
scheduleInfo:()=>this.scheduleInfo
}
},
data() {
return {
isShow:false,
row:{},
scheduleInfo:{},
select:{
page: 1,
@ -116,6 +122,7 @@ export default {
on={
{
['click']:() => {
_this.scheduleInfo = row
_this.$refs['detail'].time = moment(row.start_time).format('YYYY-MM-DD HH:mm') + '~' + moment(row.end_time).format('HH:mm')
_this.$refs['detail'].id = row.id
_this.$refs['detail'].isShow = true

@ -28,26 +28,6 @@
</div>
</div>
</template>
<template v-slot:product_sku_list>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>关联服务
</div>
<div class="xy-table-item-content">
<xy-table
ref="table"
:is-page="false"
:height="260"
:list="skus"
:table-item="skuTable"
@select="rowSelect"
@select-all="rowSelect">
<template v-slot:btns></template>
</xy-table>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
@ -69,8 +49,7 @@ export default {
form:{
name:'',
sortnumber:0,
product_sku_list:[]
sortnumber:0
},
rules:{
name:[

Loading…
Cancel
Save