Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop

This commit is contained in:
shilixia 2022-02-15 13:43:19 +08:00
commit 9e5efe57d4
10 changed files with 113 additions and 21 deletions

View File

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>

After

Width:  |  Height:  |  Size: 623 B

View File

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>

After

Width:  |  Height:  |  Size: 600 B

View File

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>

After

Width:  |  Height:  |  Size: 211 B

View File

@ -0,0 +1 @@
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>

After

Width:  |  Height:  |  Size: 440 B

View File

@ -9,7 +9,7 @@
<dv-decoration-8 class="dv-dec-8" :color="['#568aea', '#000000']" />
<div class="title">
<div class="title-text">
<span style="margin-right: 20px">*航玻车间</span><span>可视化平台</span>
<span style="margin-right: 20px">航玻生产</span><span>管理系统</span>
</div>
<dv-decoration-6
class="dv-dec-6"

View File

@ -8,8 +8,9 @@
<div class="cardsWrap" @click="toDetail('1')">
<div class="svgIconWrap">
<svg-icon
icon-class="form"
class="svgIcon"
icon-class="contract"
:className="'svgIcon'"
/>
</div>
<div class="totalCountWrap">
@ -18,16 +19,14 @@
<span class="totalCount">{{contractTotalCurrent}}</span>
<span></span>
</div>
<!--<div style="height: 35px;line-height: 35px;font-size: 16px;color: #333333">
<span>本年合同总数</span>
</div>-->
</div>
</div>
<div class="cardsWrap" @click="toDetail('2')">
<div class="svgIconWrap">
<svg-icon
icon-class="form"
class="svgIcon"
icon-class="order"
:className="'svgIcon'"
/>
</div>
<div class="totalCountWrap">
@ -41,8 +40,9 @@
<div class="cardsWrap" @click="toDetail('3')">
<div class="svgIconWrap">
<svg-icon
icon-class="form"
class="svgIcon"
icon-class="productionTask"
:className="'svgIcon'"
/>
</div>
<div class="totalCountWrap">
@ -56,8 +56,9 @@
<div class="cardsWrap" @click="toDetail('4')">
<div class="svgIconWrap">
<svg-icon
icon-class="form"
icon-class="product"
class="svgIcon"
:className="'svgIcon'"
/>
</div>
<div class="totalCountWrap">
@ -71,8 +72,9 @@
<div class="cardsWrap" @click="toDetail('5')">
<div class="svgIconWrap">
<svg-icon
icon-class="form"
icon-class="unqualified"
class="svgIcon"
:className="'svgIcon'"
/>
</div>
<div class="totalCountWrap">
@ -1064,9 +1066,9 @@
.cardsWrap:nth-child(1) {
.svgIconWrap {
background: #e9f3ff;
.svgIcon {
color: #409EFF;
fill: #409EFF;
}
}
}

View File

@ -24,7 +24,7 @@
auto-complete="on"
><svg-icon
slot="prefix"
icon-class="user"
icon-class="userName"
class="el-input__icon input-icon"
/></el-input>
</el-form-item>

View File

@ -126,6 +126,24 @@ class FaceLogin(CreateAPIView):
if user:
refresh = RefreshToken.for_user(user)
# 可设为在岗
now = timezone.now()
now_local = timezone.localtime()
if 8<=now_local.hour<=17:
ins, created = ClockRecord.objects.get_or_create(
create_by = user, create_time__hour__range = [8,18],
create_time__year=now_local.year, create_time__month=now_local.month,
create_time__day=now_local.day,
defaults={
'type':ClockRecord.ClOCK_WORK1,
'create_by':user,
'create_time':now
})
# 设为在岗
if created:
user.is_atwork = True
user.last_check_time = now
user.save()
return Response({
'refresh': str(refresh),
'access': str(refresh.access_token),

View File

@ -22,6 +22,13 @@ class ResourceCalSerializer(serializers.Serializer):
id = serializers.IntegerField(label='产品ID')
count = serializers.IntegerField(label='生产数量')
class ResourceConvertSerializer(serializers.Serializer):
id = serializers.IntegerField(label='半成品ID')
count = serializers.IntegerField(label='折合数量')
class ResourceConvertListSerializer(serializers.ListSerializer):
child = ResourceConvertSerializer()
class ResourceCalListSerializer(serializers.ListSerializer):
child = ResourceCalSerializer()

View File

@ -10,7 +10,7 @@ from apps.inm.serializers import MaterialBatchSerializer
from apps.mtm.models import Material, Step, SubProduction, SubprodctionMaterial
from apps.pm.filters import PlanFilterSet, SubproductionProgressFilterSet
from apps.system.mixins import CreateUpdateModelAMixin
from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer
from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, ResourceConvertListSerializer, ResourceConvertSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
from apps.pm.models import ProductionPlan, SubProductionProgress, SubProductionPlan
from rest_framework.viewsets import GenericViewSet, ModelViewSet
@ -216,30 +216,91 @@ class ResourceViewSet(GenericViewSet):
rdata = request.data
serializer = self.get_serializer(data=rdata)
serializer.is_valid(raise_exception=True)
productIdList = []
productList = []
for i in rdata:
if i['id'] not in productIdList:
productIdList.append(i['id'])
productList.append(i)
else:
index = productIdList.index(i['id'])
productList[index]['count'] = productList[index]['count'] + i['count']
res_d_list = []
res = []
for i in rdata:
for i in productList:
# 计算输入物料
materials = SubprodctionMaterial.objects.filter(subproduction__product__id=i['id'],
subproduction__is_deleted=False, is_deleted=False,
material__type__in=[Material.MA_TYPE_MAINSO,
Material.MA_TYPE_HELPSO], type= SubprodctionMaterial.SUB_MA_TYPE_IN).order_by('material__number')\
type= SubprodctionMaterial.SUB_MA_TYPE_IN).order_by(
'material__type', 'material__number')\
.values('material__id', 'material__name',
'material__number', 'material__type',
'count', 'material__count', 'material__count_safe')
l_m = list(materials)
for m in l_m:
if m['material__id'] in res_d_list:
index = res_d_list.index(m['material__id'])
res[index]['count'] = res[index]['count'] + m['count']*i['count']
if m['material__type'] in [Material.MA_TYPE_MAINSO, Material.MA_TYPE_HELPSO]:
index = res_d_list.index(m['material__id'])
res[index]['count'] = res[index]['count'] + m['count']*i['count']
else:
res_d_list.append(m['material__id'])
res.append({'id':m['material__id'], 'name':m['material__name'],
item = {'id':m['material__id'], 'name':m['material__name'],
'type':m['material__type'], 'number':m['material__number'],
'count':m['count']*i['count'], 'inv_count':m['material__count'],
'count_safe':m['material__count_safe']})
'count': None,'inv_count':m['material__count'],
'count_safe':m['material__count_safe']}
if item['type'] in [Material.MA_TYPE_MAINSO, Material.MA_TYPE_HELPSO]:
item['count'] = m['count']*i['count']
res.append(item)
return Response(res)
@action(methods=['post'], detail=False, perms_map={'post':'resource_cal'}, serializer_class=ResourceConvertListSerializer)
def convert(self, request, pk=None):
rdata = request.data
serializer = self.get_serializer(data=rdata)
serializer.is_valid(raise_exception=True)
res_d_list = []
res = []
half_list = rdata
while half_list:
fitem = half_list[0]
sm = SubprodctionMaterial.objects.filter(
type= SubprodctionMaterial.SUB_MA_TYPE_OUT,
is_deleted = False,
material__id = fitem['id']
).first()
if sm:
spn = sm.subproduction
sm_left_l = list(SubprodctionMaterial.objects.filter(
subproduction = spn,
type= SubprodctionMaterial.SUB_MA_TYPE_IN,
is_deleted = False,
).order_by('material__number')\
.values('material__id', 'material__name',
'material__number', 'material__type',
'count', 'material__count', 'material__count_safe'))
for i in sm_left_l:
if i['material__type'] == Material.MA_TYPE_HALFGOOD:
item = {
'id':i['material__id'],
'count':(i['count']*fitem['count'])/(sm.count)
}
half_list.append(item)
else:
if i['material__id'] in res_d_list:
index = res_d_list.index(i['material__id'])
res[index]['count'] = res[index]['count'] + \
(i['count']*fitem['count'])/(sm.count)
else:
res_d_list.append(i['material__id'])
item = {
'id': i['material__id'],
'count':(i['count']*fitem['count'])/(sm.count)
}
res.append(item)
del(half_list[0])
return Response(res)
@action(methods=['post'], detail=False, perms_map={'post':'resource_cal_equip'}, serializer_class=ResourceCalListSerializer)
def cal_equip(self, request, pk=None):
@ -256,4 +317,4 @@ class ResourceViewSet(GenericViewSet):
steps = Step.objects.filter(usedstep__is_deleted=False, usedstep__subproduction__in=subproductions)
equips = Equipment.objects.filter(step_equips__in=steps, is_deleted=False).distinct()
serializer = EquipmentSimpleSerializer(instance=equips, many=True)
return Response(serializer.data)
return Response(serializer.data)