@@ -1064,9 +1066,9 @@
.cardsWrap:nth-child(1) {
.svgIconWrap {
background: #e9f3ff;
-
.svgIcon {
color: #409EFF;
+ fill: #409EFF;
}
}
}
diff --git a/hb_client/src/views/login/index.vue b/hb_client/src/views/login/index.vue
index e86cde5..5b48238 100644
--- a/hb_client/src/views/login/index.vue
+++ b/hb_client/src/views/login/index.vue
@@ -24,7 +24,7 @@
auto-complete="on"
>
diff --git a/hb_server/apps/hrm/views.py b/hb_server/apps/hrm/views.py
index ed733da..e22ec6b 100644
--- a/hb_server/apps/hrm/views.py
+++ b/hb_server/apps/hrm/views.py
@@ -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),
diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py
index a77694f..a537ae9 100644
--- a/hb_server/apps/pm/serializers.py
+++ b/hb_server/apps/pm/serializers.py
@@ -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()
diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py
index 21967b1..62a7bbb 100644
--- a/hb_server/apps/pm/views.py
+++ b/hb_server/apps/pm/views.py
@@ -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)
\ No newline at end of file