test mini conflict

This commit is contained in:
caoqianming 2020-08-24 09:20:44 +08:00
commit acff3881cc
14 changed files with 282 additions and 25 deletions

View File

@ -3,7 +3,14 @@
<router-view /> <router-view />
</div> </div>
</template> </template>
<style >
.el-table td, .el-table th {
padding: 6px
}
.el-dialog__body {
padding: 16px 12px;
}
</style>
<script> <script>
export default { export default {
name: 'App' name: 'App'

View File

@ -21,6 +21,15 @@ export function updateCompany(id, data) {
data data
}) })
} }
export function transferCompany(id, data) {
return request({
url: `/crm/company/${id}/transfer/`,
method: 'put',
data
})
}
export function deleteCompany(id) { export function deleteCompany(id) {
return request({ return request({
url: `/crm/company/${id}/`, url: `/crm/company/${id}/`,

View File

@ -13,7 +13,11 @@
/> />
</div> </div>
</template> </template>
<style scoped>
.pagination-container[data-v-72233bcd] {
padding: 2px 2px;
}
</style>
<script> <script>
import { scrollTo } from '@/utils/scroll-to' import { scrollTo } from '@/utils/scroll-to'

View File

@ -108,7 +108,7 @@ export const asyncRoutes = [
path: 'company', path: 'company',
name: 'Company', name: 'Company',
component: () => import('@/views/crm/company.vue'), component: () => import('@/views/crm/company.vue'),
meta: { title: '客户企业', icon: '', perms: ['company_manage'] } meta: { title: '客户企业', icon: '', perms: ['company_view'] }
}, },
{ {
path: 'consumer', path: 'consumer',

View File

@ -8,7 +8,7 @@
class="filter-item" class="filter-item"
@keyup.enter.native="handleFilter" @keyup.enter.native="handleFilter"
/> />
<el-button type="primary" @click="handleAdd" icon="el-icon-plus">新增</el-button> <el-button type="primary" @click="handleAdd" icon="el-icon-plus" v-if ="checkPermission(['company_create'])">新增</el-button>
<el-button <el-button
class="filter-item" class="filter-item"
type="primary" type="primary"
@ -38,8 +38,14 @@
<span>{{ scope.row.create_time }}</span> <span>{{ scope.row.create_time }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="所属">
<template slot-scope="scope">
<span>{{ scope.row.create_admin_name }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作"> <el-table-column align="center" label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button-group>
<el-button <el-button
type="primary" type="primary"
size="small" size="small"
@ -54,6 +60,13 @@
icon="el-icon-delete" icon="el-icon-delete"
:disabled="!checkPermission(['company_delete'])" :disabled="!checkPermission(['company_delete'])"
></el-button> ></el-button>
<el-button
v-if="checkPermission(['company_transfer'])"
type="primary"
size="small"
@click="transfer(scope)"
>移交</el-button>
</el-button-group>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -79,7 +92,7 @@
</template> </template>
<script> <script>
import { getCompanyList, createCompany, deleteCompany, updateCompany } from "@/api/crm"; import { getCompanyList, createCompany, deleteCompany, updateCompany, transferCompany } from "@/api/crm";
import { deepClone } from "@/utils"; import { deepClone } from "@/utils";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination" import Pagination from "@/components/Pagination"
@ -209,7 +222,21 @@ export default {
return false; return false;
} }
}); });
} },
transfer(scope) {
this.$prompt('请输入管理员账号以确认将('+scope.row.name + ')及其学员转交给他', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
// inputPattern: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
// inputErrorMessage: ''
}).then(({ value }) => {
transferCompany(scope.row.id, {'admin':value}).then(res=>{
this.$message.success('转交成功!')
this.getList()
})
}).catch(() => {
});
}
} }
}; };
</script> </script>

View File

@ -0,0 +1,147 @@
<template>
<div >
<div >
<el-input
v-model="listQuery.search"
placeholder="输入名称进行搜索"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
<el-button
class="filter-item"
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
<el-table
:data="tableData.results"
style="width: 100%;margin-top:10px;"
border
fit
v-loading="listLoading"
highlight-current-row
max-height="600"
row-key="id"
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
@row-dblclick="handleChose2"
>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column label="单位名称">
<template slot-scope="scope">{{ scope.row.name }}</template>
</el-table-column>
<el-table-column label="创建日期">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="small"
@click="handleChose(scope)"
>选择</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.limit"
@pagination="getList"
/>
<el-dialog :visible.sync="dialogVisible" :title="dialogType==='edit'?'编辑单位':'新增单位'" >
<el-form :model="company" label-width="80px" label-position="right" :rules="rule1" ref="companyForm">
<el-form-item label="名称" prop="name">
<el-input v-model="company.name" placeholder="名称" />
</el-form-item>
</el-form>
<div style="text-align:right;">
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
<el-button type="primary" @click="confirmCompany('companyForm')">确认</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getCompanyList, createCompany, deleteCompany, updateCompany } from "@/api/crm";
import { deepClone } from "@/utils";
import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"
const defaultCompany = {
id: "",
name: "",
};
const listQuery = {
page: 1,
limit: 10,
search: "",
perm:'all'
}
export default {
name:'Companychoose',
components: { Pagination },
data() {
return {
company: {
id: "",
name: "",
},
listQuery:listQuery,
tableData: {count:0},
listLoading: true,
dialogVisible: false,
dialogType: "new",
rule1: {
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
// pid: [{ required: true, message: "", trigger: "change" }]
// password: [
// { required: true, message: "", trigger: "change" }
// ],
},
};
},
computed: {},
created() {
this.getList();
},
methods: {
checkPermission,
getList() {
this.listLoading = true
getCompanyList(this.listQuery).then(response => {
this.tableData = response.data
this.listLoading = false
});
},
resetFilter() {
this.listQuery = {
page: 1,
limit: 10,
search: "",
perm:'all'
};
this.getList();
},
handleFilter() {
this.listQuery.page = 1;
this.getList();
},
handleChose(scope) {
this.$emit('handleChose',scope.row);
},
handleChose2(row, column, event){
this.$emit('handleChose',row);
}
}
};
</script>

View File

@ -228,14 +228,25 @@
<el-input v-model="consumer.username" placeholder="手机号" /> <el-input v-model="consumer.username" placeholder="手机号" />
</el-form-item> </el-form-item>
<el-form-item label="单位" prop="company"> <el-form-item label="单位" prop="company">
<el-select <el-input
placeholder="单位"
v-model="consumer.company_.name"
readonly
>
<el-button slot="append" icon="el-icon-search" @click="choose()"></el-button>
</el-input>
<!-- <el-select
v-model="consumer.company" v-model="consumer.company"
placeholder="单位" placeholder="单位"
style="width:100%" style="width:100%"
clearable clearable
filterable filterable
remote remote
:loading="treeLoding"
:remote-method="searchCompany" :remote-method="searchCompany"
loading-text
no-match-text
> >
<el-option <el-option
v-for="item in companyData" v-for="item in companyData"
@ -243,7 +254,7 @@
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
></el-option> ></el-option>
</el-select> </el-select> -->
</el-form-item> </el-form-item>
<el-form-item label="缴费学科" prop="subjects"> <el-form-item label="缴费学科" prop="subjects">
<el-select v-model="consumer.subjects" placeholder="缴费学科" style="width:100%" multiple> <el-select v-model="consumer.subjects" placeholder="缴费学科" style="width:100%" multiple>
@ -281,6 +292,15 @@
<el-button type="primary" @click="confirmUser('consumerForm')">确认</el-button> <el-button type="primary" @click="confirmUser('consumerForm')">确认</el-button>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog
title="选择企业"
:visible.sync="dgVisiable"
:close-on-click-modal="false"
width="80%"
:append-to-body="true"
>
<Companychose ref="Companychose" @handleChose="chooseComplete"></Companychose>
</el-dialog>
</div> </div>
</template> </template>
@ -305,12 +325,14 @@ import { upUrl } from "@/api/file";
import { getUserList } from "@/api/user" import { getUserList } from "@/api/user"
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import Companychose from "@/views/crm/companychose"
const defaultConsumer = { const defaultConsumer = {
id: "", id: "",
name: "", name: "",
username: "", username: "",
company: null, company: null,
company_:{},
subjects: [], subjects: [],
workscope: null, workscope: null,
role:3 role:3
@ -321,7 +343,7 @@ const listQuery = {
search: "" search: ""
}; };
export default { export default {
components: { Pagination }, components: { Pagination, Companychose },
watch: { watch: {
filterOrgText(val) { filterOrgText(val) {
this.$refs.tree.filter(val); this.$refs.tree.filter(val);
@ -329,6 +351,7 @@ export default {
}, },
data() { data() {
return { return {
dgVisiable:false,
tableKey: 0, tableKey: 0,
showCreate: true, showCreate: true,
upUrl: upUrl(), upUrl: upUrl(),
@ -470,7 +493,7 @@ export default {
}, },
searchCompany(val) { searchCompany(val) {
this.treeLoding = true; this.treeLoding = true;
getCompanyList({search:val}).then(response => { getCompanyList({search:val, perm:'all'}).then(response => {
this.companyData = genTree(response.data.results); this.companyData = genTree(response.data.results);
this.treeLoding = false; this.treeLoding = false;
}); });
@ -512,6 +535,9 @@ export default {
}, },
handleEdit(scope) { handleEdit(scope) {
this.consumer = Object.assign({}, scope.row); // copy obj this.consumer = Object.assign({}, scope.row); // copy obj
if(this.consumer.company_ == null){
this.consumer.company_ = {}
}
this.dialogType = "edit"; this.dialogType = "edit";
this.dialogVisible = true; this.dialogVisible = true;
this.$nextTick(() => { this.$nextTick(() => {
@ -659,7 +685,18 @@ export default {
this.adminOptions = genTree(res.data.results) this.adminOptions = genTree(res.data.results)
}) })
} }
} },
choose() {
this.dgVisiable = true;
},
chooseComplete(val) {
this.dgVisiable = false;
if (val) {
this.consumer.company_ = val
this.consumer.company = val.id
}
},
} }
}; };
</script> </script>

View File

@ -175,8 +175,8 @@ Page({
if (isright == false && tm_current.user_answer != undefined) { if (isright == false && tm_current.user_answer != undefined) {
tm_current.dtime = util.formatTime(new Date()) tm_current.dtime = util.formatTime(new Date())
that.data.ctms.unshift(tm_current) that.data.ctms.unshift(tm_current)
if (that.data.ctms.length > 40) { if (that.data.ctms.length > 100) {
that.data.ctms.length = 40 that.data.ctms.length = 100
} }
} }
return isright return isright

View File

@ -130,7 +130,7 @@ Page({
} }
}, },
isPhone: function(phone){ isPhone: function(phone){
var phoneReg = /^[1][3,4,5,7,8,9][0-9]{9}$/; var phoneReg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
if (phoneReg.test(phone)) { if (phoneReg.test(phone)) {
return true; return true;
} else { } else {

View File

@ -10,14 +10,13 @@
<view wx:if="{{panduan_count>0}}">{{panduan_count}}道判断题,每题{{panduan_score}}分</view> <view wx:if="{{panduan_count>0}}">{{panduan_count}}道判断题,每题{{panduan_score}}分</view>
<view >多选题漏选每个正确选项得1分,错选0分</view> <view >多选题漏选每个正确选项得1分,错选0分</view>
<view >满分{{total_score}};{{pass_score}}以上通过</view> <view >满分{{total_score}};{{pass_score}}以上通过</view>
</view>
<view class="weui-article">
<view class="weui-article__h2">2.答题须知</view> <view class="weui-article__h2">2.答题须知</view>
<view style="color:red">进入答题后请不要后退或返回桌面</view> <view style="color:red">进入答题后请不要后退或返回桌面</view>
<view>用户可点击上一题/下一题进行切换答题</view> <view>用户可点击上一题/下一题进行切换答题</view>
<view>可点击答题卡复查</view> <view>可点击答题卡复查</view>
<view>请合理安排时间答题,可提前交卷,超时会自动提交</view> <view>请合理安排时间答题,可提前交卷,超时会自动提交</view>
</view> </view>
<a class="weui-btn weui-btn_primary" bindtap="startTest">开始考试</a>
</view> </view>
<a class="weui-btn weui-btn_primary" bindtap="startTest">开始考试</a>
</view> </view>

View File

@ -11,17 +11,17 @@
<view class="weui-media-box weui-media-box_appmsg"> <view class="weui-media-box weui-media-box_appmsg">
<view class="weui-media-box__bd weui-media-box__bd_in-appmsg"> <view class="weui-media-box__bd weui-media-box__bd_in-appmsg">
<view class="weui-media-box__title">{{item.cityName}} {{item.examDate}}</view> <view class="weui-media-box__title">{{item.cityName}} {{item.examDate}}</view>
<view class="weui-media-box__desc"> <view class="weui-media-box__desc" style="font-size:12px">
考试时间: 考试时间:
<span style="font-weight:bold;color:darkblue">{{item.examTime}}</span> <span style="font-weight:bold;color:darkblue">{{item.examTime}}</span>
<span>-</span> <span>-</span>
截止报名: 截止报名:
<span style="font-weight:bold;color:red;">{{item.endSignDate}}</span> <span style="font-weight:bold;color:red;">{{item.endSignDate}}</span>
</view> </view>
<view class="weui-media-box__desc" wx:if="{{item.linkContact}}"> <view class="weui-media-box__desc" wx:if="{{item.linkContact}}" style="font-size:12px">
联系电话:{{item.linkContact}} 联系电话:{{item.linkContact}}
</view> </view>
<view class="weui-media-box__desc"> <view class="weui-media-box__desc" style="font-size:12px">
{{item.planName}} {{item.planName}}
</view> </view>
</view> </view>

View File

@ -18,15 +18,15 @@
"checkInvalidKey": true, "checkInvalidKey": true,
"checkSiteMap": true, "checkSiteMap": true,
"uploadWithSourceMap": true, "uploadWithSourceMap": true,
"compileHotReLoad": false,
"babelSetting": { "babelSetting": {
"ignore": [], "ignore": [],
"disablePlugins": [], "disablePlugins": [],
"outputPath": "" "outputPath": ""
}, },
"useIsolateContext": true,
"useCompilerModule": false, "useCompilerModule": false,
"userConfirmedUseCompilerModuleSwitch": false, "userConfirmedUseCompilerModuleSwitch": false
"compileHotReLoad": false,
"useIsolateContext": true
}, },
"compileType": "miniprogram", "compileType": "miniprogram",
"libVersion": "2.10.3", "libVersion": "2.10.3",

View File

@ -21,6 +21,7 @@ class CompanySerializer(serializers.ModelSerializer):
""" """
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
create_admin_name = serializers.StringRelatedField(source='create_admin', read_only=True)
class Meta: class Meta:
model = Company model = Company
fields = '__all__' fields = '__all__'
@ -33,6 +34,7 @@ class ConsumerSerializer(serializers.ModelSerializer):
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
company_name = serializers.StringRelatedField(source='company', read_only=True) company_name = serializers.StringRelatedField(source='company', read_only=True)
company_ = CompanySerializer(source='company', read_only=True)
subjects_name = serializers.StringRelatedField(source='subjects', many=True, read_only=True) subjects_name = serializers.StringRelatedField(source='subjects', many=True, read_only=True)
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True) workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
role_name = serializers.StringRelatedField(source='role', read_only=True) role_name = serializers.StringRelatedField(source='role', read_only=True)

View File

@ -32,6 +32,7 @@ from .models import Company, Consumer, PaySubject, SendCode, ConsumerPerm, Consu
from .serializers import CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer from .serializers import CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer
import requests import requests
from lxml import etree from lxml import etree
from rbac.models import UserProfile
appid = 'wxf1e9471c93f05ad6' appid = 'wxf1e9471c93f05ad6'
secret = '4bf7f9bd6c52634586bbe792a1f0a834' secret = '4bf7f9bd6c52634586bbe792a1f0a834'
@ -95,7 +96,7 @@ class CompanyViewSet(ModelViewSet):
客户企业增删改查 客户企业增删改查
""" """
perms_map = [ perms_map = [
{'get': 'company_list'}, {'post': 'company_create'}, {'get': 'company_view'}, {'post': 'company_create'},
{'put': 'company_update'}, {'delete': 'company_delete'}] {'put': 'company_update'}, {'delete': 'company_delete'}]
queryset = Company.objects.filter(is_delete=0).all() queryset = Company.objects.filter(is_delete=0).all()
serializer_class = CompanySerializer serializer_class = CompanySerializer
@ -105,12 +106,36 @@ class CompanyViewSet(ModelViewSet):
ordering_fields = ('id',) ordering_fields = ('id',)
ordering = ['-id'] ordering = ['-id']
def get_queryset(self):
queryset = self.queryset
if self.request.query_params.get('perm', None):
return queryset
if not self.request.user.is_superuser:
queryset = queryset.filter(create_admin = self.request.user)
return queryset
@action(methods=['put'], detail=True, url_name='company_transfer',perms_map=[{'*':'company_transfer'}])
def transfer(self, request, *args, **kwargs):
"""
转交
"""
obj = self.get_object()
adminname = request.data.get('admin', None)
if adminname and UserProfile.objects.filter(username=adminname).exists():
adminobj = UserProfile.objects.get(username=adminname)
obj.create_admin = adminobj
obj.save()
Consumer.objects.filter(company=obj).update(create_admin=adminobj)
return Response(status=status.HTTP_200_OK)
else:
return Response({"error":"账号错误"})
class ConsumerViewSet(ModelViewSet): class ConsumerViewSet(ModelViewSet):
""" """
学员增删改查 学员增删改查
""" """
perms_map = [ perms_map = [
{'get': 'consumer_list'}, {'post': 'consumer_create'}, {'get': 'consumer_view'}, {'post': 'consumer_create'},
{'put': 'consumer_update'}, {'delete': 'consumer_delete'}] {'put': 'consumer_update'}, {'delete': 'consumer_delete'}]
queryset = Consumer.objects.all() queryset = Consumer.objects.all()
serializer_class = ConsumerSerializer serializer_class = ConsumerSerializer